C++ к преобразованию C# SendMessage с помощью COPYDATASTRUCT

Я преобразовываю приложение C++ в C#, который обычно был довольно прямым, но теперь я имею дело с указателями и сталкиваюсь с проблемами.

Это - исходный код C++

  ShockVideoInfo* pVideoInfo = new ShockVideoInfo;
  COPYDATASTRUCT  cd;

  cd.dwData = bSelf ? SHOCK_REQUEST_SELFVIEW_WINDOW : SHOCK_REQUEST_MAINVIEW_WINDOW;
  cd.lpData = pVideoInfo;
  cd.cbData = sizeof(ShockVideoInfo);

  pVideoInfo->dwLeft   = 10;
  pVideoInfo->dwTop    = 10;
  pVideoInfo->dwWidth  = 100;
  pVideoInfo->dwHeight = 100;
  pVideoInfo->dwFlags  = SHVIDSHOW | SHVIDSIZE | SHVIDTOPMOST | SHVIDMOVE | SHVIDSIZABLE;

  if (::SendMessage(m_hShockWnd, WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)&cd))
    Log(eResult, _T("Window updated"));
  else
    Log(eError, _T("Window not updated"));

с определением структуры

typedef struct tagShockVideoInfo
{
  DWORD dwLeft;
  DWORD dwTop;
  DWORD dwWidth;
  DWORD dwHeight;
  DWORD dwFlags;

} ShockVideoInfo;

Вот мое преобразование в C#, с помощью Упорядочивающий для обработки указателей:

ShockVideoInfo videoInfo = new ShockVideoInfo();
COPYDATASTRUCT cd = new COPYDATASTRUCT();

cd.dwData = (IntPtr)_shockRequestMainviewWindow;
cd.lpData = Marshal.AllocCoTaskMem(cd.cbData); // Pointer to videoInfo
Marshal.StructureToPtr(videoInfo, cd.lpData, true);
cd.cbData = Marshal.SizeOf(videoInfo);        

// Set-up video window position
videoInfo.dwFlags = _shvidShow | _shvidSize | _shvidTopmost | _shvidMove | _shvidSizable;
videoInfo.dwTop = 10;
videoInfo.dwLeft = 10;
videoInfo.dwHeight = 100;
videoInfo.dwWidth = 100;

IntPtr cdPointer = Marshal.AllocCoTaskMem(Marshal.SizeOf(videoInfo));
Marshal.StructureToPtr(videoInfo, cdPointer, true);

if ( (int) SendMessage(_hWnd, WM_COPYDATA, _formHandle, cdPointer) == 1 )
{
    Debug.WriteLine("Window updated");
}
else
{
    Debug.WriteLine("Window not updated");
}

Marshal.FreeCoTaskMem(cdPointer);
Marshal.FreeCoTaskMem(cd.lpData);

Кроме того, я использую следующее в своем коде C#:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

[StructLayout(LayoutKind.Sequential)]    
struct ShockVideoInfo
{
    public uint dwLeft;
    public uint dwTop;
    public uint dwWidth;
    public uint dwHeight;
    public uint dwFlags;
}

[StructLayout(LayoutKind.Sequential)]
struct COPYDATASTRUCT
{
    public IntPtr dwData;
    public int cbData;
    public IntPtr lpData;
}

Мой код не получает ответ, который я хочу (который перемещает окно видео), таким образом, я сделал что-то не так.

Может кто-либо с опытом в этой области показывать мне, что я делаю неправильно?

1
задан Peter Bridger 21 July 2010 в 13:58
поделиться

1 ответ

Я думаю, что нашел свою проблему:

IntPtr cdPointer = Marshal.AllocCoTaskMem(Marshal.SizeOf(videoInfo));
Marshal.StructureToPtr(videoInfo, cdPointer, true);

Должно было быть:

IntPtr cdPointer = Marshal.AllocCoTaskMem(Marshal.SizeOf(cd));
Marshal.StructureToPtr(cd, cdPointer, false);

Другими словами, я не передавал указатель на структуру videoInfo ! Что помогает :)

2
ответ дан 2 September 2019 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: