Вызов результирующей процедуры GetProcAddress сообщает ERROR_FILE_NOT_FOUND

Я получаю доступ к dll-библиотеке С++ (у меня нет исходного кода) из кода С++. Я использую эту библиотеку для монтирования USB-устройства, чтобы иметь доступ к файлам на устройстве. Этот код хорошо работал в VS2010, но после обновления до VS2013 он больше не работает. Вот мой вопрос. Какие различия между VS2010 и VS2013 могут привести к сбою или какие настройки могут привести к сбою?

Вот что я наблюдаю при запуске кода:

  1. Вызов LoadLibary возвращает дескриптор модуля
  2. GetProcAddress, кажется, возвращает действительный адрес процедуры
  3. Вызов dyn_Open_Device всегда возвращает false с VS2013, он почти всегда возвращает true в VS2010.
  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

person Steve E    schedule 17.01.2018    source источник
comment
все это абсолютно не связано с visual-studio и getprocaddress. DUMPBIN результаты для чего?! dyn_Open_Device(); возвращает ERROR_FILE_NOT_FOUND, что означает, что устройство не найдено. все   -  person RbMm    schedule 18.01.2018


Ответы (1)


Решил проблему с помощью Process Monitor. В диалоговом окне «Свойства события» монитора процессов на вкладке «Процесс» я увидел, что запущена 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

person Steve E    schedule 20.01.2018