Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#向C+发送消息+;WinProc_C#_C++ Cli_Sendmessage - Fatal编程技术网

C#向C+发送消息+;WinProc

C#向C+发送消息+;WinProc,c#,c++-cli,sendmessage,C#,C++ Cli,Sendmessage,我需要从C++中发送一个字符串到C++窗口处理程序。有许多与此相关的问题,但没有一个答案对我有用。情况如下: PInvoke: [DllImport("user32", CharSet = CharSet.Auto)] public extern static int SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, string lParam); C#: string lparam = "abc"; NativeMethods.User32

我需要从C++中发送一个字符串到C++窗口处理程序。有许多与此相关的问题,但没有一个答案对我有用。情况如下:

PInvoke:
[DllImport("user32", CharSet = CharSet.Auto)]
public extern static int SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, string lParam);

C#:
string lparam = "abc";
NativeMethods.User32.SendMessage(handle, ConnectMsg, IntPtr.Zero, lparam);

C++:
API LRESULT CALLBACK HookProc (int code, WPARAM wParam, LPARAM lParam)
{       
    if (code >= 0)
    {
        CWPSTRUCT* cwp = (CWPSTRUCT*)lParam;
                ...
        (LPWSTR)cwp->lParam   <-- BadPtr
                ...
    }

    return ::CallNextHookEx(0, code, wParam, lParam);
}
PInvoke:
[DllImport(“user32”,CharSet=CharSet.Auto)]
公共外部静态int SendMessage(IntPtr hWnd、uint wMsg、IntPtr wParam、字符串lParam);
C#:
字符串lparam=“abc”;
NativeMethods.User32.SendMessage(handle、ConnectMsg、IntPtr.Zero、lparam);
C++:
API LRESULT回调HookProc(int代码、WPARAM WPARAM、LPARAM LPARAM)
{       
如果(代码>=0)
{
CWPSTRUCT*cwp=(CWPSTRUCT*)LPRAM;
...

(LPWSTR)CWP->LPARAM< < > > C++ >代码> LPWSTR 或<代码> LPSRT< /CONT>参数,在您的DLLIMPORTH中需要使用C*<代码> StringBuilder < /> >


< > C++ >代码> LPCWSTR 或LPCSTR 参数,在DLLimPurt中需要使用C<代码>字符串。< /P> < P>确保您的SeN消息消息以预期的同步方式发生,并且您的NATVEMETHODS类映射适当的Win32调用(发送与后置消息)。如果这是不正确的,那么在你的消息在C++端被处理的时候,你可能已经离开了C的方法的范围,并且在堆栈上创建的任何局部变量都消失了,导致了你的坏指针。
跨线程调用的堆栈和堆注意事项:线程有自己的堆栈,但共享堆。一个线程中的堆栈分配变量在另一个线程中不可见。字符串类型在.NET中是一个奇数duck。它是一个对象派生的引用类型,但在代码中看起来和感觉上类似于值类型。因此,可能传递指向堆的指针-分配的数据应该可以工作。这就是StringBuilder作为堆分配引用类型的作用。

我肯定在使用SendMessage,所以在处理消息之前,我不应该返回C。这是跨线程调用吗?线程有自己的堆栈,但共享堆。一个线程中的堆栈分配变量将不可见字符串类型在.NET中是一个奇怪的duck。它是对象派生的引用类型,但看起来和感觉上都像是值类型。所以传递一个指向堆分配数据的指针应该是有效的。也许这就是StringBuilder的用武之地。