3

我正在尝试制作一个可能依赖于 Wacom 平板电脑的应用程序。该程序不需要工作,但它是一个很好的补充。虽然,它也应该在没有安装 Wintab32.dll 的计算机上工作,我想检查一下 DLL 是否可用。

这段代码会产生一个错误,我想在它产生之前捕获它。我正在使用 WintabDN 来支持 .net Wacom 应用程序。

if (WintabDN.CWintabInfo.IsWintabAvailable())
{
    // Initialize Wintab
    WintabLib.Initialize(true);
    WintabLib.OnWintabPacketReceived += WintabLib_OnWintabPacketReceived;
}

失败 IsWintabAvailable:System.DllNotFoundException:无法加载 DLL“Wintab32.dll”:找不到指定的模块。(HRESULT 异常:0x8007007E)在 WintabDN.CWintabFuncs.WTInfoA(UInt32 wCategory_I, UInt32 nIndex_I, IntPtr IpOutput_O) 在 WintabDN.CWintabInfo.IsWintabAvailable()

这个错误的问题在于它是一个消息框,而不是包抛出的异常。如何防止此消息框出现?

4

3 回答 3

2

这有点棘手,因为底层异常已经在处理中。

试图阻止消息框显示将很困难,如果不是不可能的话。你可以做一些真正的黑客行为,比如观察者线程来捕捉前台窗口的变化,然后手动向应用程序的底层消息队列发送鼠标点击消息,以尝试触发消息框上的 OK 按钮。

所以我有两个建议:这是关于DLL搜索顺序的官方主题;您可以使用它来模拟搜索并提前找到文件。

如果您不想这样做,您可以从中导入LoadLibrary方法kernel32.dll,然后调用它以尝试加载 WintabDN 库尝试使用的 DLL;如果您遇到异常,那么您知道 WintabDN 库也会。这是一个几乎相关的主题,有助于绑定 LoadLibrary:http: //blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_ .aspx

于 2012-09-05T13:01:09.937 回答
1

尝试以下哪些答案:

(如果系统上没有安装 Wintab,Wintab SDK 示例将无法运行。如果系统上没有平板电脑(没有 Wintab),如何使我的程序工作?)

http://www.wacomeng.com/windows/docs/WacomWindevFAQ.html

于 2012-09-05T13:10:50.997 回答
0

如何防止此消息框出现?

你不能:

    public static bool IsWintabAvailable()
    {
        IntPtr buf = IntPtr.Zero;
        bool status = false;

        try
        {
            status = (CWintabFuncs.WTInfoA(0, 0, buf) > 0);
        }
        catch (Exception ex)
        {
            MessageBox.Show("FAILED IsWintabAvailable: " + ex.ToString());
        }

        return status;
    }

:D

我讨厌库开发人员,编写这样的代码。他们不应该决定您将选择哪种错误处理机制。

但它是开源的,你可以解决这个问题。
或者你可以在他们的跟踪器上发布一个错误,然后等待他们修复它。

于 2012-09-05T13:01:54.907 回答