64bit 版のメモリマップドファイルを作成するには?

解決


こうすけ  2016-02-05 04:46:01  No: 47950

環境
OS  :Win7 pro
アプリ:Delphi 10 Seattle

メモリマップドファイルを下記コードにて作成しているのですが

FHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE,0, 100, PChar(mapName));

ターゲットプラットフォームが 「32ビット Windows」の場合は正常に作成されているのですが、「64ビット Windows」に変えると 0が戻り、作成されていません。(32,64ともデバッグしながら確認)

64bitで作成する為はどこか設定を変えるのかコード自体を変更する必要があるのでしょうか?

ご存知の方がいれば教えてください。


igy  2016-02-05 04:53:15  No: 47951

ちなみに、Subscription Update 1 は適用されてますか?


通りすがり  2016-02-05 05:50:00  No: 47952

CreateFileMapping(INVALID_HANDLE_VALUE,...
では?あとGetLastErrorは?


こうすけ  2016-02-05 20:29:53  No: 47953

コメント頂き有難うございます。
>igyさん
Subscription Update 1 は適用しています。

>通りすがりさん
エラー時のGetLastErrorは「6」でSysErrorMessage(GetLastError)は「ハンドルが無効です」となりました。

また、INVALID_HANDLE_VALUEを指定すると作成されました。
ちなみにINVALID_HANDLE_VALUEの値は
32bitの場合「4294967295」、
64bitの場合「18446744073709551615」
でしたので、

FHandle := CreateFileMapping($FFFFFFFFFFFFFFFF,
と書けば同じく64bitで動きました。

INVALID_HANDLE_VALUEと書いておけば
仮にターゲットが変わった場合でもソースの修正がいらないのでこの
形式で記載します。

ソースの「CreateFileMapping」の箇所にカーソルをあてて表示されるポップアップの
第一引数の箇所が
32bitの時:system.Cardinal
64bitの時:system.Uint64
となっておりターゲットによって引数の型が変わるのですね。
当たり前なのかもしれませんが、初めて知りました。

以上、有難うございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加