2009-09-15 7 views
7

user32.dllなどのシグネチャを作成すると、対象が64ビットコンピュータの場合、これをuser64.dllで構築する必要がありますか?64ビットのウィンドウでのP/Invokeには、32ビットと異なる署名が必要ですか?

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
public static extern bool ChangeClipboardChain(
    IntPtr hWndRemove, 
    IntPtr hWndNewNext); 

私は彼らのデータベースにアクセスするための32ビット・ライブラリーを提供ベンダー(プログレスOpenEdge)からによるライブラリに32ビットのみをターゲットにしていて現在、これは問題ではありません。

私は現在、このような場合には、64ビットWindowsコンピュータがありません。

答えて

12

命名規則にもかかわらず、user32.dll(およびその他の32 ... dll)は、実際には64ビットマシンでは64ビットです。これらはdllの歴史的な名前であり、基礎となるアーキテクチャの変更にかかわらずそのように保たれています。詳細はthisページをお読みください。

+1

64/32ビットアプリケーション間でファイルシステムがどのように変化しているかをページが示す方法は、わかりやすいです。あなたのお返事ありがとうございました。 –

+0

ようこそ。私は助けてうれしいです。 –

5

は、USER32.DLL関数を呼び出すときにリンクするDLLの署名/名前を変更する必要があります。

命名規則にもかかわらず、64ビットWindowsマシンでは、[Windows] \ System32にあるUSER32.DLLファイルは実際には64ビットのDLLです。 32ビットバージョンのUSER32.DLLは、実際には[Windows] \ SysWow64というフォルダにあります。

詳細については、this questionを参照してください。

おそらく最も注意する必要があることの1つは、さまざまなWindows API関数のパラメータとして渡すデータ型です。たとえば、USER32.DLL内の "SendMessage"関数には、少なくとも1つのパラメータ(page on P/Invokeに従う)を持つ特定の要件があります。

それが署名だがある。

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

と明確状態下2 & 3注:

2) のlParamとして "INT" または "整数" を使用しないでください。あなたのコードは、64ビットの ウィンドウでクラッシュします。 IntPtr、 "ref" 構造体、または "out"構造体のみを使用してください。

3)戻り値として "bool"、 "int"、または "integer"を使用しないでください。 コアが64ビットウィンドウでクラッシュします。 IntPtrのみを使用してください。 bool - pInvokeは IntPtrをブール値にマーシャリングできません。

この「注意点は、」それは私がに任意の Windows API関数を呼び出すときに特に注意を払って何かだが、この特定の機能(のSendMessage)に特異的であると思われます。

+0

そのクレイグありがとう、それは素晴らしいです。私は1つの質問があります、なぜ 'System.Windows.Forms.Message.Msg'は' int'の型を持っていますか?以前は 'int 'を使っていたのと同じ署名の中で、' SendMsg'のために 'Msg'で使われることがあるので、尋ねるだけです。 –

+1

@Brett - これは良い質問ですが、正確な答えはわかりませんが、SendMessageシグネチャがMsgパラメータをUInt32として受け取り、.NET Intは常に32ビットです( IntPtr構造体は基礎となるWindowsプラットフォームを反映するように設計されています(つまり、32ビットWindowsでは32ビット構造ですが、64ビットWindowsでは64ビット構造)。これは私に代わって推測したものです。私は自分自身の正確な答えを知ることに興味があります。 – CraigTP

+0

ええ、私はそれを考え出した。興味深いことに、 'UInt32'と' Int32'は異なる上限と下限を持っているので 'int'ではなく' uint'ではありませんが、0 - Int32.MaxValueの外に何かを送る者はエラーになりますとにかくちょうど実際の観測:) –

関連する問題