Hi,
Ich versuche mit C# einen string/string pointer per Windos Message mit Invoking zu schicken.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| #region SendReceiveMessage
[DllImport("user32.dll")] public static extern IntPtr FindWindow(string strClassName, string strWindowName);
[DllImport("user32.dll")] public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
public const int WM_APP = 0x8000; public const int WM_MYMSG =WM_APP + 0x100;
void SendMessageToUnmanaged() { IntPtr hWnd = FindWindow(null, "Fenstername");
string s = "Somestring";
IntPtr sNative = Marshal.StringToHGlobalAuto(s); IntPtr result = SendMessage(hWnd, WM_MYMSG, (IntPtr)1234, sNative); Marshal.FreeHGlobal(sNative);
}
#endregion |
Das ganze funktioniert auch problemlos.
Aber wenn ich jetzt versuche die Message in einer MFC Anwendung zu empfangen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| BEGIN_MESSAGE_MAP(CIProgDlg, CDialog) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON2, &CIProgDlg::OnBnClickedButton2)
ON_MESSAGE ( WM_MYMSG, OnMyMsg ) END_MESSAGE_MAP()
LRESULT CIProgDlg::OnMyMsg(WPARAM wParam, LPARAM lParam) { int wP = wParam; char* lP = (char*)lParam;
return MessageBox(L"Hello",L"Top",MB_OK); } |
Bekomme ich die Werte:
Wparam = 1234
Lparam = 84393680
Der String:
lp = 0x0048a018 “”
oder
0x004da1b8 “Y+Ö”
oder andere kryptische sachen. Mit StringToHGlobalAnsi das Gleiche. Wie bekomme ich denn den richtigen string wieder raus?
Mit freundlichen Grüßen
Vielen Dank
Moderiert von
Narses: Code- durch C#-Tags ersetzt