Я пытаюсь заставить приложение C # WPF взаимодействовать с другим приложением, написанным на C, используя WM_COPYDATA. Приложение C пытается отправить структуру следующим образом:
typedef struct
{
int x;
int y;
char str[40];
double d;
char c;
} DATASTRUCT;
В моем приложении на C # я определил структуру следующим образом:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct DATASTRUCT
{
public int x;
public int y;
[MarshalAs(UnmanagedType.LPStr, SizeConst=40)]
public string s;
public double d;
public char c;
};
А код для получения сообщения WM_COPYDATA выглядит следующим образом:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
hwndSource = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
hwndSource.AddHook(new HwndSourceHook(WndProc));
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == 0x4A)
{
DATASTRUCT data = (DATASTRUCT)Marshal.PtrToStructure(lParam, typeof(DATASTRUCT));
this.updateText(data);
handled = true;
}
return (IntPtr)0;
}
Я получаю сообщения из приложения C, но все данные в структуре - бред. До этого мне удалось вручную извлечь массив байтов из указателя lParam, а затем использовать System.BitConverter и System.Text.Encoding.ACII для интерпретации байтового массива, и это работало довольно хорошо. Но сейчас я пытаюсь сделать это более чистым способом, и он просто не работает.