我从c ++代码访问c ++ dll库(我没有源代码)。我使用这个库来安装USB设备,这样我就可以访问设备上的文件了。此代码在VS2010中运行良好,但自从我们更新到VS2013后它就不再有效了。这是我的问题。 VS2010和VS2013之间的差异可能会导致此故障或哪些设置可能导致此故障?
以下是我在运行代码时观察到的内容:
以下是代码:
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
答案 0 :(得分:0)
我在Process Monitor的帮助下解决了这个问题。在Process选项卡下的Process Monitor的Event Properties对话框中,我可以看到eeyelog_protocol_v1.0.dll正在运行,其依赖项libusb0.dll也在运行。但是,正在运行的libusb0.dll是旧版本的错误版本。一旦我运行了正确的版本,那么一切都恢复了。它通过调试器运行代码,它从包含可执行文件的目录中获取了错误版本的libusb0.dll。因此,请确保您正在加载并运行正确的版本。我在使用SetDllDirectory设置的路径中使用了正确的版本,但它使用了错误的版本,因为它首先发现了一个版本。
之前我从未使用过Process Monitor。这是一个非常有用的Microsoft SysInternals工具。可以从https://docs.microsoft.com/en-us/sysinternals/downloads/procmon
下载