Как правильно запустить форму winforms из DLL? - PullRequest
0 голосов
/ 26 мая 2010

Есть еще один вопрос, похожий на мой, но я хотел бы собрать некоторые подробности:

Я хочу создать DLL, которая вызывается из неуправляемого кода. Когда неуправляемые функции вызываются в DLL, я хочу собрать информацию и показать ее в виде формы.

Что я хотел бы сделать, так это когда DllMain () вызывается и причина DLL_PROCESS_ATTACH , я хотел бы создать экземпляр формы. Эта форма должна быть запущена в отдельном потоке. Когда вызывается моя функция FOO () внутри моей DLL, я бы хотел взять информацию из FOO () и отправить ее в форму для рендеринга.

Итак, более конкретно:

i) Как правильно создать проект DLL и иметь возможность иметь формы Windows, созданные в конструкторе, доступными для DLL?

ii) Как правильно придать этой форме собственный поток и цикл обработки сообщений?

iii) Как отправить информацию из неуправляемых функций DLL в форму или, альтернативно, в управляемый класс, который может обновлять свое собственное состояние и форму?

Форма внутри DLL является своего рода «монитором» для передачи данных в DLL и из нее, так что я могу отслеживать ошибки / ошибки, но не изменять основные функции доступных функций DLL.

Ответы [ 3 ]

0 голосов
/ 02 сентября 2010

Приложение может иметь только один цикл обработки сообщений - весь ваш пользовательский интерфейс должен существовать в одном потоке.Вы можете создать немодальную форму, которая находится в потоке пользовательского интерфейса приложения, но если поток пользовательского интерфейса "занят", он не будет отправлять сообщения в вашу форму, поэтому он не будет интерактивным.Чтобы избежать проблем, нужно написать отдельный .exe-файл для обработки формы, и ваша DLL просто запустит его, чтобы вся форма работала как отдельный обычный процесс WinForms.Затем вы можете использовать сокеты, сообщения WM_USER или даже просто общие файлы для отправки команд и данных в процесс формы из вашей dll.(Преимущество сокета заключается в том, что вы также можете запустить форму мониторинга на другом ПК)

0 голосов
/ 13 сентября 2010

Вот что я делаю:

    
static HWND *callbackWindow;
struct Info instanceInfo;
DLLEXPORT void setCallbackWindow(HWND* newCallbackWindow) {
       callbackWindow = newCallbackWindow;
}
DLLEXPORT void checkForInformation() {
        /* gather some info ... */
        instanceInfo.computerOver = VERY_YES;
}
DLLEXPORT void retrieveInformation() {
        PostMessage(callbackWindow, ...);
}

Сначала установите обратный вызов в Form.Handle. Вы можете либо вызвать checkForInformation (), переопределив WndProc в форме .NET, либо установить таймер на периодический вызов checkForInformation. Как только ваша форма готова к информационному вызову, вызовите retrieveInformation () и проверьте в обработчике окна формы магическое сообщение (WM_USER + ваше смещение).

0 голосов
/ 26 мая 2010

Вы должны быть очень осторожны, когда делаете что-то в DllMain (вы НЕ МОЖЕТЕ вызывать LoadLibrary или другие функции, которые получают блокировку загрузчика)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...