2

sendmessage を使用して、C++ アプリケーションから C# にメッセージを渡そうとしています。

私のC ++コードはこのようなものです

int _tmain(int argc, _TCHAR* argv[])
{

 COPYDATASTRUCT cpd;
 cpd.dwData = 0;    
 LPCWSTR strDataToSend = L"http://google.com";;

     cpd.cbData = (wcslen(strDataToSend) + 1) * 2;
     cpd.lpData = (PVOID)strDataToSend; 
 SendMessage((HWND)0x0020073C,5555,0,(LPARAM)&cpd);


return 0;
}

私はSendMessageWで試しましたが、正しいハンドルをハードコーディングしましたが、コールバックをヘッティングしていますが、データを取得していません

私のC#アプリケーションはこのようなものです

    public struct COPYDATASTRUCT
    {
        public IntPtr dwData;
        public int cbData;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpData;
    }


    protected override void WndProc(ref Message m)
    {
        // Listen for operating system messages.

        switch (m.Msg)
        {
            // The WM_ACTIVATEAPP message occurs when the application
            // becomes the active application or becomes inactive.
            case 5555:

                COPYDATASTRUCT mystr = new COPYDATASTRUCT();
                Type mytype = mystr.GetType();
                mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
                MessageBox.Show ( mystr.cbData.ToString());
                MessageBox.Show(mystr.lpData);
                break;
             }
             base.WndProc(ref m);
           }

メッセージボックスが空白になっています...... COPYDATASTRUCT を使用せずに試してみました 渡す文字列のみ plz 誰でも助けてくれます.. 事前に感謝します


  int _tmain(int argc, _TCHAR* argv[])
  {

  COPYDATASTRUCT cpd;
  cpd.dwData = 0;    
  LPCWSTR strDataToSend = L"http://google.com";;

   cpd.cbData = (wcslen(strDataToSend) + 1) * 2;
   cpd.lpData = (PVOID)strDataToSend; 
   SendMessage((HWND)0x0020073C,WM_COPYDATA,0,(LPARAM)&cpd);


 return 0;
}

C# コード

public struct COPYDATASTRUCT
{
    public IntPtr dwData;
    public int cbData;
    [MarshalAs(UnmanagedType.LPStr)]
    public string lpData;
}
 public const int WM_COPYDATA = 0x4A;


protected override void WndProc(ref Message m)
{
    // Listen for operating system messages.

    switch (m.Msg)
    {
        // The WM_ACTIVATEAPP message occurs when the application
        // becomes the active application or becomes inactive.
        case WM_COPYDATA:

            COPYDATASTRUCT mystr = new COPYDATASTRUCT();
            Type mytype = mystr.GetType();
            mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
            MessageBox.Show ( mystr.cbData.ToString());
            MessageBox.Show(mystr.lpData);
            break;
         }
         base.WndProc(ref m);
       }
4

2 に答える 2

0

あなたがやろうとしているのは、いくつかの基本的なIPC(プロセス間通信)です。

これはC#の場合は問題ではありませんが、C++の場合は問題です。

おそらく、いくつかの基本的なCOMが役に立ちます。非常に簡単で、SendMessageやWindowハンドルなどを使用する必要はありません。

COMの概要

COMパート2の概要

于 2012-06-11T07:58:41.667 に答える