質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

2024閲覧

VC#とVC++でのWM_DEVICECHANGE

untan.r

総合スコア17

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/11/25 05:25

VC++でこのような処理で、USBデバイスの抜き差しを監視しています。
とあるVC++のDLLを用いており、DLLにWPARAMとLPARAMを渡す処理を書いています。

VC++

1BEGIN_MESSAGE_MAP() 2 ON_MESSAGE(WM_DEVICECHANGE, OnDeviceChange) 3END_MESSAGE_MAP() 4 5OnDeviceChange(WPARAM wParam, LPARAM lParam) 6{ 7 //何かしらの処理 8 HOGEHOGE(wParam, lParam); 9}

上記をVC#で書き換えようと考えており、VC#からVC++のDLLを[DLLImport]で呼び出せることが分かり、以下のコードでUSBデバイスの抜き差しを監視しようとしました。
しかし、どうも引数で渡されてくるMessageオブジェクトのlParamの値が、VC++でのLPARAMの値と違っているようなのです。

VC#

1enum WINDOW_MESSAGES : uint 2{ 3 WM_DEVICECHANGE = 0x0219, 4} 5protected override void WndProc(ref Message m) 6{ 7 switch ((WINDOW_MESSAGES)m.Msg) 8 { 9 case WINDOW_MESSAGES.WM_DEVICECHANGE: 10 //何かしらの処理 11 break; 12 } 13}

そもそも、VC#での監視のやり方が間違っているのか、
LPARAMの扱い方が変わっているのか、正直さっぱりです。
どうにかして、VC#でVC++と同様のLPARAMを取得する方法はありませんでしょうか?

VC++, VC#共にそこまで経験が長いわけでもなく、久々に扱うので無茶苦茶なことを言っているかも知れませんが、双方の言語に理解が深い方のお力をお貸しください。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/11/25 05:45

LPATAMにどういう値を入れて、C#側ではどういう値になってるんでしょうか。
guest

回答1

0

こんにちは。

WM_DEVICECHANGE メッセージはWindowsからトップレベルのウィンドウへ届くメッセージですので、VC++とVC#で異なるものが届くということはありえません。
ですので、C#側で受け取り損なっている可能がかなり高いです。

そもそも、VC#での監視のやり方が間違っているのか、
LPARAMの扱い方が変わっているのか、正直さっぱりです。

C#はC++と異なり、原則として生ポインタを扱えませんので、ちょっと特殊な処理が必要になります。C#でリムーバブルメディアの着脱を検知する方法 その1 などが参考になるかも知れません。

投稿2018/11/25 07:58

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問