отобразить и закрыть c # форму c ++, используя UnmanagedExports - PullRequest
0 голосов
/ 02 сентября 2018

Мне нужно отобразить форму C # с сообщением «Пожалуйста, подождите», а затем выполнить дополнительные задачи в фоновом режиме. Когда эти дополнительные задачи завершены, я должен скрыть / закрыть эту форму. Я делаю это в консольном приложении C ++. Я вызываю функции для отображения и закрытия формы, которые определены в C # и выставлены с использованием UnmanagedExports. Проблема в том, что форма не отображается должным образом (все элементы управления не загружены), и когда курсор переводится в форму, он показывает состояние загрузки. Как правильно отобразить форму, выполнить задачи, а затем закрыть форму?

C ++ код:

using CSharpFormShow = void(__stdcall *)(HWND hwnd, wchar_t* message);
using CSharpFormClose = void(__stdcall *)();
int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE mod = LoadLibraryA("CSharp.dll");
    CSharpFormShow formShow = reinterpret_cast<CSharpFormShow>(GetProcAddress(mod, "formshow"));
    CSharpFormClose formClose = reinterpret_cast<CSharpFormClose>(GetProcAddress(mod, "formclose"));
    formShow(hwnd,L"This is a message");
    //perform some tasks
    formClose();
    getchar();
    return 0;
}

C # код:

[DllExport(ExportName = "formshow", CallingConvention = CallingConvention.StdCall)]
public static void showForm(IntPtr owner, [MarshalAs(UnmanagedType.LPWStr)]string message)
{
    NativeWindow nativeWindow = new NativeWindow();
    nativeWindow.AssignHandle(owner);
    Form_Wait form = new Form_Wait();
    form.label_message.Text = message;
    form.Show(nativeWindow);
}
[DllExport(ExportName = "formclose", CallingConvention = CallingConvention.StdCall)]
public static void closeForm()
{
    form.Dispose();
}

1 Ответ

0 голосов
/ 04 сентября 2018

Мне удалось решить проблему, добавив Application.DoEvents (); после form.show (); Теперь он работает нормально и форма показывает правильно. Теперь финальный код showForm c # становится:

NativeWindow nativeWindow = new NativeWindow();
nativeWindow.AssignHandle(owner);
Form_Wait form = new Form_Wait();
form.label_message.Text = message;
form.Show(nativeWindow);
Application.DoEvents();

Привет

...