• ベストアンサー
  • 暇なときにでも

MapViewOfFile() はカウンタを進めない?

Windows APIの質問です。 PINT GetShareInt() { ____HANDLE hmap = CreateFileMapping( ________INVALID_HANDLE_VALUE, NULL, ________PAGE_READWRITE, ________0, sizeof(int), ________TEXT("Share") ); ____PINT pi = (PINT)MapViewOfFile( ________hmap, FILE_MAP_WRITE, 0, 0, 0); ____CloseHandle(hmap); ____return pi; } こんな感じの関数で変数をプロセス間共有したいのですが、 ファイルマッピングオブジェクトが毎回生成されてしまい、 変数を共有できません。 先にCloseHandleするのは後の処理がUnmapViewOfFileするだけで すむからです。変則的ですが、MapViewOfFile呼び出ししている以上 hmapが指すカーネルオブジェクトは開放されないと思うのですが。 MapViewOfFileがカーネルオブジェクトの内部カウンタを進めていない、 ということでしょうか?それではマルチスレッドで扱えないような気が するのですが、私の認識のどこが間違っているのでしょうか? よろしくご指導お願い申し上げます。

共感・応援の気持ちを伝えよう!

  • 回答数5
  • 閲覧数1355
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.5

#1です。 >クラスオブジェクトのデストラクタとUnmapViewOfFileの機能は違いますよね。 >スマートポインタと言うんでしょうか? 正式な用語で言うところの「スマートポインタ」とは別物ですが、考え方は同じです。 もちろんオブジェクトのデストラクタとUnmapViewOfFileの機能は全然違うものです。しかしデストラクタでUnmapViewOfFileやCloseHandleを呼び出すようにしておけば、Closeし忘れていても自動的に開放されるというわけです。 >次のようにするとマッピングオブジェクトは共有さ>れるようです。 >PVOID GetMem() { >----HANDLE hMap = CreateFileMapping(... >----DWORD dwEroor = GetlastError(); >----PVOIE pMem = MapViewOfFle(... >----if (dwError) CloseHandle(hMap); >----return pMem; >} この場合は2度目の呼び出しのときはCloseHandleが実行されますが、1度目のときは実行されない(dwError==0となる)ので開放し忘れに気をつける必要があると思います。この方法で共有できるようですがやはりMicrososftが意図している通りの順序(Create、Map、Unmap、Close)で使用したほうがいいと思います。 >「共有の制約」とは何のことでしょうか? >また、今回はページングファイルに支持されたメモリマップドファイルですから例外かもしれません。 確かに考えてみたらまったく関係がないかもしれません。すみません。共有の制約というのはhFileのshare属性のように思えますので。 http://www.microsoft.com/japan/msdn/library/ja/jpmemory/html/_win32_unmapviewoffile.asp

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご返答ありがとうございます。 単純なデストラクタとCloseHandleのやっていることとは違う、ということを言いたかったんですが、釈迦に説法のようなことをしてしまい、赤面の至りです。 msdnの関数説明のところに書いてあったんですね。文書番号や「共有の制約」などで見当違いな検索をしていました。 >1度目のときは実行されない(dwError==0となる)ので開放し忘れに気をつける必要があると思います 理解しております。今回はシステムフックするDLLにコーディングしています。つまり最初に読み込むプロセスがフックの所有者であるため、このプロセスで解放する必要がないということで前述のコードにしたわけです。 >やはりMicrososftが意図している通りの順序(Create、Map、Unmap、Close)で使用したほうがいいと思います これについてはもちろん同意します。現在のOSで動くからといってもドキュメントされていない以上、仕様はいつ変更されるかわかりませんよね。(Microsoftは極力、動作互換性を重視してくれるとは思いますが) SDKを使う際にはメカニズムがどうなっているのかイメージしておきたいという気持ちがありますので、他人には理解されない質問かも、と思っていました。しかし数々のアドバイスをいただき、私なりに大変勉強になりました。 ご回答本当にありがとうございました。

関連するQ&A

  • CreateFileMapping について

    CreateFileMapping を使用し アプリケーション間のデータ共有プログラムを作成しています。 CreateFileMapping には構造体を登録し その構造体で 文字列配列を動的に確保したいのですが // 構造体 typedef struct {   char **huga; } HOGE; main ---------------------------------- // マップ map = CreateFileMapping(   (HANDLE)0xffffffff,   NULL,   PAGE_READWRITE | SEC_COMMIT,   0, sizeof(HOGE),   "MAP_NAME"); // ビュー data = ( HOGE * )MapViewOfFile( map, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(HOGE) ); // 初回 flag = ( GetLastError() == ERROR_ALREADY_EXISTS ); if ( !flag ) {   // 確保 1   data->huga = new char*[ 10 ];   for ( int i = 0; i < 10; i++ ) {     // 確保 2     data->huga[ i ] = new char[ 256 ]; sprintf_s( data->huga[ i ], 256, "[ %d ]", i );   } } // 確認 for ( int i = 0; i < 10; i++ ) {   MessageBox( NULL, data->huga[ i ], "MAP", MB_OK ); } 上記のようにすると 確保する前の構造体が Mappingされているのか データを共有することが出来ませんでした。 動的確保した文字列配列を共有するには どのように設計すれば宜しいでしょうか。 よろしくお願いします。

  • Delphi6 DLL内でのメモリ共有(?)

    こんにちは、honiyonです。  複数アプリケーションからそれぞれコールバック関数を登録してもらい、状況に応じてそれぞれのコールバック関数を呼び出す、というDLLを作成しています。  しかし現在、呼び出しアプリケーションごとにメモリ空間が独立してしまい、コールバック情報を同一空間内で管理出来ずに困っています。  旧VerのDelphiで16bit DLLなら、interface部に定義した変数、オブジェクトはDLL内で同一空間内で共有出来るようですが、これをDelphi6 32bitDLLで行う事は不可能でしょうか? もしくは、その他の方法で独立メモリ空間を作らないようにする方法はありますでしょうか?  不可能な場合、CreateFileMappingが次に有効な手段として候補に挙がると思います。CreateFileMappingで管理クラスのポインタを渡してクラス共有というのは現実的な手法でしょうか?  よろしくお願いいます(..

  • 【C++】セマフォとプロセスの使い方

    【C++】セマフォとプロセスの使い方 WindowsXPでVC++2008コンパイラを使用して、 プロセスとセマフォについて勉強しています。 外部プログラム(今回は電卓として)を5つ立ち上げるのですが、 同時に立ち上げるのは2つまでとしたい場合、どのように組むのでしょうか。 http://nienie.com/~masapico/api_CreateSemaphore.html こちらにスレッドを使用したセマフォを使ったサンプルがあるのでが、 プロセスを使うとなると、うまく書けません。 ご指導頂けませんでしょうか。 ===現在まで書いたソース=== (5つのプロセスをつくるループも実装していませんが、、、) #include<windows.h> #include<stdio.h> #include<tchar.h> HANDLE g_hSemaphre; void main(){ BOOL bRet; STARTUPINFO si; PROCESS_INFORMATION pi; //Semaphoreオブジェクト g_hSemaphre = CreateSemaphore(NULL,2,2,NULL); bRet = CreateProcess(_T("C:\\WINDOWS\\system32\\calc.exe"), _T(""), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); //プロセス終了 WaitForSingleObject(pi.hProcess,INFINITE); //後処理(プロセス開放) ReleaseSemaphore(g_hSemaphre,1,NULL); //スレッドとプロセスを閉じる。 CloseHandle(pi.hThread); CloseHandle(pi.hProcess); //Semaphoreオブジェクト CloseHandle(g_hSemaphre); }

その他の回答 (4)

  • 回答No.4
  • kmb01
  • ベストアンサー率45% (63/138)

ファイルマッピングとCloseHandleとはそういうものなのだと思います。 プロセスAでCreateFileMapping(..., TEXT("Share")); プロセスAでCloseHandle プロセスBでCreateFileMapping(..., TEXT("Share")); プロセスBでCloseHandle としたときに、プロセスBが新しいファイルマッピングオブジェクトを作るのは自然なことに思われます。 >MapViewOfFile呼び出ししている以上 >hmapが指すカーネルオブジェクトは開放されないと思うのですが。 「ユーザは全ハンドルを解放したが、マップトファイルが参照している」という状態で残るのかも… 解決策は、CloseHandleしない、というのが一番いいと思われます…

共感・感謝の気持ちを伝えよう!

質問者からのお礼

私も同じ結論を仮定していました。 「ユーザはマップトファイルの全ハンドルを解放したが、最低ひとつのビューが参照している状態」ではマップトファイルは解放されていないが取得することはできない。 そういうことだと思います。 kmb01さん、回答ありがとうございました。

  • 回答No.3

#1です。補足になります。 MSDNではUnmapViewOfFileについて ---------------------- •Windows 95:1 つのファイルの最後のビューがまだアンマップされていない場合、そのファイルは引き続き開いていて、元のファイルハンドルと同じ共有の制約が適用されます。 •Windows NT/2000:1 つのファイルの最後のビューがまだアンマップされていない場合、そのファイルは引き続き開いていますが、共有の制約は適用されません。 ---------------------- とありました。つまり、Win9x系ではyak3141さんの意図する通りに動作するのかもしれません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

下の回答も含めてご返事が送れました。本当に丁寧な回答ありがとうございます。 「共有の制約」とは何のことでしょうか? セキュリティフラグあるいはビューの読み書きモードのことですかね? また、今回はページングファイルに支持されたメモリマップドファイルですから例外かもしれません。 msdnを早速探してみましたが目的の文書は見つけることはできませんでした。よろしければリンクを教えていただけないでしょうか? 回答のお礼が遅れた上でのあつかましいお願いですが、よろしければもう少しお付き合いくださいませ。

質問者からの補足

次のようにするとマッピングオブジェクトは共有されるようです。 PVOID GetMem() { ----HANDLE hMap = CreateFileMapping(... ----DWORD dwEroor = GetlastError(); ----PVOIE pMem = MapViewOfFle(... ----if (dwError) CloseHandle(hMap); ----return pMem; }

  • 回答No.2

#1です。 >なぜ先にCloseHandleしてはいけないのでしょうか? >こだわるのは >1.解放忘れがない >2.ひとつの変数だけ保持しておけばよいので楽 >というメリットがあるからなのですが、それだけで 詳しいメカニズムについて私は知りませんが。。。普通のメモリに例えるとおそらく以下のようになっているのではないでしょうか? BYTE* pszBuff; char* pCopy; pszBuff = new BYTE[10];  //メモリ確保 pCopy = (char*)pszBuff;  //アドレス取得 delete pszBuff;      //メモリ開放忘れがないように先にdelete strcpy(pCopy,"asss");   //取得したアドレスだから使えるはずだけど。。。 開放忘れを防ぎたいというのでしたら、以下のようなクラスを作成すればいいかと思います。 class CFileMapping { HANDLE _hMap; HANDLE _hMem; public: CFileMapping(){_hMap = NULL;_hMem = NULL;} ~CFileMapping() { Unmap(); Close(); } void Unmap() { if(_hMem) UnmapViewOfFile(_hMem); _hMem = NULL; } void Close() { if(_hMap) CloseHandle(_hMap); _hMap = NULL; } 。。。。。そのたCreateFileMappingやMapViewなどをする関数を用意 };

共感・感謝の気持ちを伝えよう!

質問者からのお礼

再回答ありがとうございます。 クラスオブジェクトのデストラクタとUnmapViewOfFileの機能は違いますよね。スマートポインタと言うんでしょうか?

  • 回答No.1

>先にCloseHandleするのは後の処理がUnmapViewOfFileするだけですむからです。 これが原因ではないでしょうか? 普通は ----------------- hMap = CreateFileMapping() pMem = MapViewOfFile() 処理 UnmapViewOfFile (pMem); CloseHandle(hMap); ----------------- のように使うかと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

早速の回答ありがとうございます。 質問でも述べさせていただきましたが、 なぜ先にCloseHandleしてはいけないのでしょうか? こだわるのは 1.解放忘れがない 2.ひとつの変数だけ保持しておけばよいので楽 というメリットがあるからなのですが、それだけではなく 「MapViewOfFileした後なのに、CloseHandleするとマッピングオブジェクトが解放されてしまう」という現象をなぜそうなるのかメカニズムを知りたいと思い、質問させていただきました。 nitscapeさん、回答ありがとうございました。

関連するQ&A

  • 共有メモリへのマッピング(MapViewOfFile)について

    共有メモリについて(特にMapViewOffileについて)教えてください。 ある構造体と、あるデータAを共有メモリへマッピングしたい考えています。 構造体は、 typedef struct _Data { int length; long data; char mIntArrayData[256]; } Data; データAは、short型の配列(要素数はx*y*z,x,y,zはcsvファイル等から読み込む)で、サイズをdatasize = sizeof(short) * x * y * z;とします。 この2つを使って、 両方のデータを long AllDataSize = sizeof(Data) + datasizeとしました。 このサイズを使って、共有メモリのマップハンドルを hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,PAGE_READWRITE,AllDataSize,MAPPED_FILE_NAME); (MAPPED_FILE_NAMEは、 メモリマップドファイルの名前) で、生成しました。 生成はできたのですが、データAにアクセスするための下記のような時にマッピングに失敗してしまいました。 DWORD dwOffset = sizeof(DATA); short *pData = (short *)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, dwOffset, Bytes); (Bytesはマッピングしたいバイト数でsizeof(short)の倍数) 次のようなDATAにアクセスするマッピングには成功しています。 DWORD dwOffset = 0; DATA *pDATA = (DATA *)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, dwOffset, sizeof(DATA)); 色々なサイト等を調べて、考えてみたのですが、怪しいところはdwOffsetと、CreateFileMappingで、マッピングしたい全体のファイルサイズを、構造体とデータAのサイズの単純な足し算としているところと考えています。ただ、はっきりとした答えが全くわからないので、どうか御教授お願いします。

  • [C#][FX]DLLを利用した共有メモリの動作

    こんにちわ。 外国為替取引のFXに利用するプログラムを作成しています。 その中で、 C#のプログラムAと MQLという言語によるプログラムBにおいて、 共有メモリ読み書きを行うDLLを利用して、 (1)Aの結果を共有メモリに書き込み→Bで受け取って処理。 (2)Bの結果を共有メモリに書き込み→Aで受け取って処理。 という仕組みを作成しています。 (2)はできたのですが、(1)がうまくいきません。 知見をお持ちの方アドバイスいただけませんでしょうか。 以下詳細でございます。 ●相談内容 共有メモリ書き込み時に以下エラーが発生し、書き込みができない。 「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」 ●ソース(一部抜粋。InitializeとRunは基盤システムからコールされます。) 【C#ソース】 using System.Runtime.InteropServices; using System; [DllImport("MemMap.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern string SetMemString(string tag, string msg); public bool Initialize() { try{ Console.Write("try01"); SetMemString("TEST", "1"); Console.Write("try02"); SetMemMethod(); }catch(Exception e){ Console.Write(e.Message); Console.Write(e.StackTrace); } return true; } public void SetMemMethod(){ SetMemString("TEST", "2"); } public void Run(){ try{ Console.Write("try03"); SetMemString("TEST", "3"); }catch(Exception e){ Console.Write(e.Message); Console.Write(e.StackTrace); } } } } 【コンソール】 try01 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。 場所 test.Main.SetMemString(String tag, String msg) 場所 test.Main.Initialize() try03 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。 場所 test.Main.SetMemString(String tag, String msg) 場所 test.Main.Run( 【DLL】 MT4_EXPFUNC const char* __stdcall SetMemString(char *tag,char *msg) { /*static*/ string ret = ""; bool create = false; HANDLE hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, tag); if (!hMap) { hMap= CreateFileMapping((HANDLE)0xFFFFFFFF , NULL , PAGE_READWRITE , 0 , 1024 , tag); q.push(hMap); create = true; } LPSTR strAllCmd =(LPSTR)MapViewOfFile(hMap , FILE_MAP_WRITE , 0 , 0 , 0); lstrcpy(strAllCmd , msg); FlushViewOfFile(strAllCmd,0); UnmapViewOfFile(strAllCmd); if(!create) CloseHandle(hMap); return(ret.c_str()); } ●詳細 try01直後の初期化メソッド(Initialize)で直接コールするSetMemStringは問題なく出来ており、プログラムB側で読むことができていますが、 try02直後の初期化メソッド(Initialize)でコールするメソッドの中のSetMemStringと try03直後のメイン処理(Run)の中のSetMemString でエラーが発生します。 try02はソースの綺麗さを保つために別メソッドに切り出したいだけなので、 最悪初期化メソッドに直書きすればよいですが、 メイン処理なので、try03でエラーが発生するのはなんとしても解決したいです。 try01で呼べていることからDllImportのスコープがうまくできていないのでは? と考えています。 継承元のExpertクラスはソースが隠蔽されていて、わかりませんが、 何かアドバイスいただけませんでしょうか。よろしくお願いします。

  • VC++メッセージの送受信について教えてください。

    VC++でソフトを作成しています。 初心者なのでわからないことだらけです。 どなたかご教授お願いします。 ■環境 Windows xp mode Visual Studio 2010 Professional VC++ フォームアプリケーション .net Framework4.0 ■相談内容 アプリ1のtextBoxに入力された文字列をアプリ2に送信して、アプリ2のtextBoxに表示させたいのですが、PostMessageを使用するとメッセージが送れません。 また、SendMessageを使用すると送れますが、共有メモリを使用すると文字列が途中で途切れてしまいます。 PostMessageと共有メモリの使用は指令なのではずせません。 理由は送信側のアプリがロックされるのを防ぐため、後に多数のアプリから送信した文字列を取得できるようにするためです。 下記にソースコードを記載しますので、どこが悪いのか、何が原因でそうなるのか、どうすれば正常に動作するようにできるのかを教えてください。 特に、ソースについてはどこをどのように直せば良いかを教えていただけるとありがたいです。 &#65374;送信側ソース&#65374; #pragma once #include<windows.h> #include<iostream> #include<fstream> #include<string> #include<msclr/marshal.h> #pragma comment(lib,"user32.lib") int s; using namespace std; using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Runtime::InteropServices; using namespace msclr::interop; [DllImport("user32.dll") ] extern System::String^ FindWindow(String^ lpClassName, String^ lpWindowName); [DllImport("user32.dll")] extern System::String^ PostMessage(HWND hWnd, int Msg, int wParam, int lParam); public: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { System::String^ moji_textBox4; moji_textBox4=textBox4->Text; s=textBox4->Text->Length+1; COPYDATASTRUCT cd; HWND hWnd; char buffer[500]; sprintf_s(&buffer[0],5,"%s",moji_textBox4); cd.dwData=0; cd.cbData=s;//strlen(buffer)+1; cd.lpData=buffer; hWnd=::FindWindow(nullptr,L"アプリ2"); ::PostMessage((HWND)hWnd,WM_COPYDATA,0,(LPARAM)&cd); &#65374;受信側ソース&#65374; #pragma once #pragma comment(lib,"user32.lib") #include<ctype.h> #include<windows.h> #include<msclr/marshal.h> using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Runtime::InteropServices; using namespace msclr::interop; public: virtual void WndProc(System::Windows::Forms::Message% msg) override { if(msg.Msg== WM_COPYDATA) { COPYDATASTRUCT *cd; cd=(COPYDATASTRUCT *)msg.LParam.ToInt32(); System::String^ str; str=gcnew System::String((char *)cd->lpData); pin_ptr<const wchar_t>pstr=PtrToStringChars(str); System::String^ ShareMemoryName1=L"Information"; HANDLE hmap; char *pmap; marshal_context^ context= gcnew marshal_context; LPCTSTR ShareMemoryName2 = context->marshal_as<LPCTSTR>(ShareMemoryName1); hmap=::CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,2048, (LPCTSTR)ShareMemoryName2); pmap=(char *)::MapViewOfFile(hmap,FILE_MAP_ALL_ACCESS,0,0,1024); System::String^ pstr1= gcnew System::String(pstr); ZeroMemory(pmap,2048); memcpy_s(pmap,2048,pstr,sizeof(pstr)); System::String^ str1; str1= gcnew System::String((char *)pmap); textBox6->Text=str1; UnmapViewOfFile(pmap); CloseHandle(hmap); } Form::WndProc(msg); }

  • VC++ 2010 メッセージが文字化けします。

    現在、VC++でアプリケーションを作っています。 超初心者なのでわからない事だらけです。 どなたかご教授お願いします。 <質問内容> sendmessageで送信した文字列をtextboxに表示したら文字化けします。 原因がわからないので、もし何か気づかれた方がおられましたら教えてください。 特にどのように変更すれば良いかご指摘いただけると本当に助かります。 <開発環境> Windows XPモード Visual Studio 2010 professional Visual C++ windows フォームアプリケーション <アプリ動作> 2つのアプリケーションを使用し、片方のアプリから文字列を送り、もう片方のアプリで受信します。 また、受け取った側のアプリケーションは受け取った文字列をtextboxに表示します。 送信側はsendmessage関数で文字列を送信し、受信側はwndproc関数と、共有メモリを使用して受信と表示を行っています。 下記がソースです。 &#65374;送信側ソース&#65374; #pragma once #include<windows.h> #include<iostream> #include<fstream> #include<string> #pragma comment(lib,"user32.lib") using namespace std; using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Runtime::InteropServices; [DllImport("user32.dll") ] extern System::String^ FindWindow(String^ lpClassName, String^ lpWindowName); [DllImport("user32.dll")] extern System::String^ SendMessage(HWND hWnd, int Msg, int wParam, int lParam); public: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {              COPYDATASTRUCT cd; HWND hWnd; char buffer[500]; strcpy_s(buffer,"失敗しました。");       cd.dwData=0; cd.cbData=strlen(buffer)+1; cd.lpData=buffer; hWnd=::FindWindow(nullptr,L"ソフト"); ::SendMessage((HWND)hWnd,WM_COPYDATA,0,(LPARAM)&cd); } &#65374;受信側ソース&#65374; #pragma once #pragma comment(lib,"user32.lib") #include<ctype.h> #include<windows.h> #include<msclr/marshal.h> using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Runtime::InteropServices; using namespace msclr::interop; public: virtual void WndProc(System::Windows::Forms::Message% msg) override { if(msg.Msg== WM_COPYDATA) { COPYDATASTRUCT *cd; cd=(COPYDATASTRUCT *)msg.LParam.ToInt32(); System::String^ str; str=gcnew System::String((wchar_t*)cd->lpData); pin_ptr<const wchar_t>pstr=PtrToStringChars(str); System::String^ ShareMemoryName1=L"LotInformation"; HANDLE hmap; LPVOID pmap; marshal_context^ context= gcnew marshal_context; LPCTSTR ShareMemoryName2 = context->marshal_as<LPCTSTR>(ShareMemoryName1); hmap=OpenFileMapping(FILE_MAP_WRITE,FALSE,ShareMemoryName2); if(hmap==NULL) { hmap=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,(DWORD)0,(DWORD)2048,(LPCTSTR)ShareMemoryName2); if(hmap!=NULL) { pmap=MapViewOfFile(hmap,FILE_MAP_WRITE,0,0,0); hmap=OpenFileMapping(FILE_MAP_WRITE,FALSE,ShareMemoryName2); if(pmap!=NULL) { ZeroMemory(pmap,2048); } } } else { pmap=MapViewOfFileEx(hmap,FILE_MAP_WRITE,0,0,0,NULL); } ZeroMemory(pmap,2048); memcpy_s(pmap,2048,pstr,sizeof(pstr)); System::String^ str1; str1= gcnew System::String((const wchar_t *)pmap); textBox5->Text=str1; UnmapViewOfFile(pmap); CloseHandle(hmap); } Form::WndProc(msg); }

  • karnell32エラー(訂正:EXE間でデータを受け渡し時の~) 2

    Public Function gfExecChildProcessAndWait(ByRef frmForm As Form, ByVal strExeFileName As String, _ ByVal blnFlgParentFormUnload As Boolean) As Boolean Dim lngProcessId As Long Dim lngProcessHandle As Long Dim lngWin32apiResultCode As Long Dim lngProcessExitCode As Long On Error GoTo SysErr_gfExecChildProcessAndWait: gfExecChildProcessAndWait = True lngProcessExitCode = 0 ' 実行可能ファイルを起動(コマンドライン引数付き) lngProcessId = Shell(strExeFileName, vbNormalFocus) ' プロセスオブジェクトのハンドルを取得 lngProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, False, lngProcessId) ' 新しいプロセスを作成できた場合は If lngProcessHandle <> 0 Then '呼び出し元のフォームをアンロード(あるいはHide) If (blnFlgParentFormUnload = True) Then Unload frmForm Else frmForm.Hide End If ' ポーリング Do ' プロセスの終了状態を取得し、モジュールレベル変数に格納 lngWin32apiResultCode = GetExitCodeProcess(lngProcessHandle, lngProcessExitCode) ' オペレーティングシステムに制御を渡す DoEvents Loop While lngProcessExitCode = STILL_ACTIVE ' プロセスが終了していない間ループ Else Call gsLogWrite("gfExecChildProcessAndWait", "プロセスハンドルの取得に失敗しました。") gfExecChildProcessAndWait = False End If ' プロセスオブジェクトのハンドルをクローズ lngWin32apiResultCode = CloseHandle(lngProcessHandle) Exit Function SysErr_gfExecChildProcessAndWait: gfExecChildProcessAndWait = False Exit Function End Function

  • カウンターに座る カウンター席に座る

    先日、「カウンターに座って食事をしていたところ、隣に座っていたお客さんの行動に迷惑した」というような質問を見かけました。 私は『カウンターに座って』という部分は『カウンター席に座って』ということだと思って質問を読んでいたのですが、 回答者さんの1人が『カウンターに座って』をそのまま受け取ってしまったのか、あるいは其の方なりのユーモアであったのか、 『カウンターに座ってはいけません。カウンター席に座りましょう』的な回答をしていました。 (結局、その回答は何らかの理由で消されてしまったようです) こういった場合、確かに受け取る側にとっては『カウンターに座る』『カウンター席に座る』どちらとも取れるといえば取れますね。 みなさんはどう取りますか?

  • カウンター 増えないのは?

    お世話になります。 下記、サンプルを参考にちょっとカウンターのスクリプトを書いてみたのですが、どうもカウントがアップしません。 どこがおかしいのかご指摘いただけると幸いです。 <?php //カウンターファイル $cnt_file = "count.dat"; //カウンター桁数 $cnt_len = 10; //カウンターファイルが存在すればカウンター値を読取る if(file_exists($cnt_file)){ $file = fopen($cnt_file, "r+"); $conut = fgets($file, $cnt_len); $count = $count + 1; } //ファイルなし新規作成 else { $file = fopen($cnt_file, "w"); $conut = 1; } //ファイルポインタを先頭にセットする rewind($file); //ロック flock($file, LOCK_EX); //書きこみ fputs($file, $conut, $cnt_len); //ロック解除 flock($file, LOCK_UN); //閉じる fclose($file); ?>

    • ベストアンサー
    • PHP
  • カウンタについて

    学校で、 「カウンタ回路(カウンタIC)が使われている身の回りのものを10こ探してきてください」 と言われました。 電子レンジとかかなと思ったのですが、あまり思いつかないので質問しました。どなたかよろしくお願いします。

  • カウンターなんですが

    下記のようなカウンターを探しています。 http://www.value-counter.com/ 合計 今日 昨日 上記URLのものは少しサイズが小さいものですから もう少し大きいものが無いかと思いお聞きした次第です ご存知の方是非、教えて下さい。 お願いします。

  • カウンターが出なくなりました

    超初心者です。 HPを作成してもらったのですが、カウンターの数字が出なくなりました。先日までは表示されていましたが・・・ host:www.(HPアドレス)is not authorized と表示されています。 セキュリテイーはマカフィーが入っています。