调用GetProcAddress结果过程报告ERROR_FILE_NOT_FOUND

时间:2018-01-17 21:00:39

标签: visual-studio-2010 visual-studio-2013 getprocaddress

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

以下是我在运行代码时观察到的内容:

  1. LoadLibary调用返回模块句柄
  2. GetProcAddress似乎返回有效的程序地址
  3. 调用dyn_Open_Device总是在VS2013中返回false 几乎总是在VS2010中恢复正常。
  4. 调用dyn_Open_Device后,GetLastError返回2 (ERROR_FILE_NOT_FOUND)
  5. 以下是代码:

    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
    

1 个答案:

答案 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

下载