В результате PostMessage "... вызов функции pinvoke разбалансирует стек c # ..." - PullRequest
0 голосов
/ 24 июня 2018

В 32-битном управляемом приложении я использую Proecess.Start для загрузки 64-битного .Net-приложения.После этого я PostMessage () из 32-битного приложения в 64-битное приложение с помощью MainWindowHandle.Проблема в том, что при вызове PostMessage () я получаю сообщение об ошибке «При вызове функции PInvoke« xxxx :: PostMessage »разбалансирован стек ...» После нажатия кнопки «продолжить» все работает нормально.Я использую VS 2017. Если я перевожу 32-битное приложение в 64-битное, нет проблем.Также у меня не возникает проблемы при запуске 32-битного приложения вне VS.Оба приложения в C #.Могу ли я просто снять флажок PInvokeStackImbalance в MDA или мне следует о чем-то «беспокоиться»?

Спасибо

Ниже приведен код в форме для запуска клиентского приложения, закрепите его основнойсформировать и установить дескриптор текущей формы для клиентского приложения.

    private const int SEND_HANDLE = WM_USER + 101;
    [DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)]
    private static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);
    private void DoDock()
    {
        ProcessStartInfo psi = new ProcessStartInfo("test.exe");
        psi.Arguments = "";
        psi.UseShellExecute = false;
        psi.RedirectStandardOutput = true;

        pDocked = Process.Start(psi);

        while (hWndDocked == IntPtr.Zero)
        {
            pDocked.WaitForInputIdle(1000);
            Thread.Sleep(100);
            pDocked.Refresh();
            if (pDocked.HasExited)                
                return;
            hWndDocked = pDocked.MainWindowHandle;  //cache the window handle
        }

        PostMessage(hWndDocked, SEND_HANDLE, this.Handle.ToInt32(), 0);
    }

1 Ответ

0 голосов
/ 25 июня 2018

Обычно это означает, что ваша декларация pinvoke неверна. Этот веб-сайт отображает правильную декларацию как:

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
...