2010-02-28 73 views
0

似乎在App未完成加载时调用P-Invoke会使相关函数出错。启动时避免P/Invoke错误

例如,目前我试图通过LoadLibrary在启动时加载各种DLL,并测试它们是否已导出特定函数。

如果我在应用程序完成其加载过程时执行此操作,则不会给出错误(只是结果为0,我可以通过GetLastError检查它们),如果我在启动时执行它(例如表单的Load事件)它会发现错误(例如缺少模块等)。

有一种方法可以将这些错误静音?

请注意,这些并不是例外,但系统消息框和try ... catch在此处不起作用。

谢谢。

回答

1

从调用LoadLibrary()中看到消息框并没有多大意义。看看P/Invoking SetErrorMode()与SEM_NOOPENFILEERRORBOX解决了你的问题。使用Shown而不是Load事件也值得一试。

+0

谢谢,解决了这个问题。 :) – feal87 2010-02-28 10:34:32

+0

就像一个笔记,我用SetErrorMode中的所有值。只有SEM_NOOPENFILEERRORBOX不足够。 :P(我在完成DLL扫描后重新激活它们) – feal87 2010-02-28 10:41:54

0

如果要检测/测试各种DLL是否有特定的入口点,请使用GetProcAddress()API。如果GetProcAddress()为特定入口点返回0,则该入口点不在该DLL中。

+0

科夫科夫,我已经知道这一点。问题是另一个......我已经这样做了。但是,如果LoadLibrary失败并从启动中调用,则会出现一个消息框。 :P – feal87 2010-02-28 09:21:19

+0

哦,我明白了。我的错。由于你题目的标题有“P/Invoke错误”,我认为错误是从P/Invokes到实际的DLL。根据你上面的评论,你实际看到的是LoadLibrary()失败。 – Ants 2010-02-28 15:41:48

0

我没有代码尝试,但我有一种感觉,你会得到一个消息框,因为异常是在一个单独的线程中引发,而不是由您的try和catch块处理。你可以尝试在你的应用程序开始时连接这两个事件,并试着看看这个异常是否被你的事件处理程序捕获到了。

Application.ThreadException 
    AppDomain.CurrentDomain.UnhandledException