1

我正在从 c++ 代码访问一个 c++ dll 库(我没有源代码)。我使用这个库来挂载一个 USB 设备,这样我就可以访问设备上的文件。此代码在 VS2010 中运行良好,但自从我们更新到 VS2013 后,它不再运行。这是我的问题。VS2010 和 VS2013 之间的哪些差异可能导致此失败或哪些设置可能导致此失败?

这是我在运行代码时观察到的:

  1. LoadLibary 调用返回一个模块句柄
  2. GetProcAddress 似乎返回了一个有效的过程地址
  3. 在 VS2013 中调用 dyn_Open_Device 总是返回 false,在 VS2010 中几乎总是返回 true。
  4. 调用 dyn_Open_Device 后,GetLastError 返回 2 (ERROR_FILE_NOT_FOUND)

这是代码:

typedef bool(*PFUNC_Open_Device)();

DWORD dwError = GetLastError();
BOOL bSuccess = SetDllDirectory(_T("C:\\Users\\steve epp\\Desktop\\EH16\\sdk1.1\\lib\\"));

// Step 2: Dynamically load the dll
HMODULE m_hModule = LoadLibrary("eeyelog_protocol_v1.0.dll");

dwError = GetLastError();

// Handle the case that the dll is not found
if (m_hModule == NULL)
{
    dwError = GetLastError();
    if (dwError == ERROR_MOD_NOT_FOUND)
    {
        CString msg = "Unable to load eeyelog_protocol_v1.0.dll.";
        AfxMessageBox(msg, MB_OK | MB_ICONEXCLAMATION);
    }
}

PFUNC_Open_Device dyn_Open_Device = (PFUNC_Open_Device)GetProcAddress(m_hModule, "Open_Device");
dwError = GetLastError();

bool ret = dyn_Open_Device();
dwError = GetLastError();

这是 DUMPBIN 结果:

DUMPBIN /EXPORTS "C:\Users\steve epp\Desktop\EH16\sdk1.1\lib\eeyelog_protocol_v1.0.dll"
Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file C:\Users\steve epp\Desktop\EH16\sdk1.1\lib\eeyelog_protocol_v1.0.dll

File Type: DLL

  Section contains the following exports for eeyelog_protocol_v1.0.dll

    00000000 characteristics
    59CC4F90 time date stamp Wed Sep 27 18:25:36 2017
        0.00 version
           1 ordinal base
          33 number of functions
          33 number of names

    ordinal hint RVA      name

          1    0 000010A0 Check_Device_state
          2    1 000011D0 Close_Device
          3    2 000012E0 Login
          4    3 000011A0 Open_Device
4

1 回答 1

0

我在 Process Monitor 的帮助下解决了这个问题。在 Process 选项卡下的 Process Monitor 的 Event Properties 对话框中,我可以看到 eeyelog_protocol_v1.0.dll 正在运行,并且它的依赖项 libusb0.dll 也在运行。但是,运行的 libusb0.dll 是错误的版本和旧版本。一旦我运行了正确的版本,那么一切都会再次运行。通过调试器运行代码,它从包含可执行文件的目录中选择了错误版本的 libusb0.dll。因此,请确保您正在加载和运行正确的版本。我在使用 SetDllDirectory 设置的路径中有正确的版本,但它使用了错误的版本,因为它首先找到了那个。

我以前从未使用过进程监视器。这是一个非常有用的 Microsoft SysInternals 工具。它可以从https://docs.microsoft.com/en-us/sysinternals/downloads/procmon下载

于 2018-01-20T02:03:56.703 回答