2010-02-28 4 views
0

Кажется, что вызов P-Invoke, когда приложение не завершено, заставляет его извергать ошибки связанных функций.Избегайте ошибок P/Invoke во время запуска

Например, в настоящий момент я пытаюсь загрузить при запуске различные DLL через LoadLibrary и проверить, экспортировали ли они определенную функцию.

Если я это сделаю, когда приложение завершило свою процедуру загрузки, то не будет выдана ошибка (только результат равен 0, и я могу проверить их через GetLastError). Если я сделаю это во время запуска (например, событие загрузки формы) он извергает ошибки (например, отсутствующий модуль и т. д.).

Есть способ отключить эти ошибки?

Обратите внимание, что это не исключение, но системные сообщения и попытка ... catch здесь не работает.

Спасибо.

ответ

1

Не имеет большого значения, что вы увидите окна сообщений с вызовом LoadLibrary(). См., Если P/Invoking SetErrorMode() с SEM_NOOPENFILEERRORBOX решает вашу проблему. Использование показанного вместо события загрузки стоит попробовать.

+0

Спасибо, исправляет проблему. :) – feal87

+0

Как примечание, я использовал все значения в SetErrorMode. Только SEM_NOOPENFILEERRORBOX не хватает. : P (я повторно активирую их, когда я завершил сканирование DLL) – feal87

0

Если вы хотите обнаружить/проверить, что различные библиотеки DLL имеют определенные точки входа, используйте API GetProcAddress(). Если GetProcAddress() возвращает 0 для конкретной точки входа, то эта точка входа не существует в этой DLL.

+0

Coff Coff, я уже знаю это. Вопрос другой ... Я уже это делаю. Но если LoadLibrary терпит неудачу и вызывается из запуска, появляется сообщение. : P – feal87

+0

О, я вижу. Виноват. Поскольку ваш вопрос озаглавлен «P/Invoke errors», я предположил, что ошибки были от P/Invokes до фактической DLL. Основываясь на вашем комментарии выше, то, что вы на самом деле видели, это неудачи LoadLibrary(). – Ants

0

У меня нет кода, чтобы попробовать, но у меня есть ощущение, что вы получаете окно сообщения, потому что исключение выбрасывается в отдельный поток и не обрабатывается блоком try и catch. Можете ли вы попытаться подключить эти два события в начале вашего приложения и попытаться выяснить, попадает ли исключение в ваш обработчик событий.

Application.ThreadException 
    AppDomain.CurrentDomain.UnhandledException 
Смежные вопросы