Я получил эту ошибку Loadlibraty () 3765269347, беспокоит меня. Я реализую консольное приложение C ++, построенное как x64, чтобы загрузить родную C ++ dll для x64. Ниже приведен код в консольном приложении C ++ для загрузки библиотеки DLL:
bool InitDll()
{
HINSTANCE hInst = LoadLibrary(_T("C:\\TIS_Nick\\Hardware\\Devices\\ThorDetectorSwitch\\TDSTest\\TDSTest\\Debug\\Modules_Native\\ThorDetectorSwitch.dll"));
if( hInst != NULL )
{
FreeLibrary( hInst );
return true;
}
else
{
DWORD err = GetLastError();
return false;
}
}
Я получил ошибку 3765269347, что, я думаю, означает, что C ++ не может обработать эту ошибку. Я уверен, что мой путь для загрузки DLL является правильным.
Я также использую Контролировать процесс проследить, как будут вызываться dll и функции. и вот информация, которую я считаю актуальной.
11:08:07.3196483 AM TDSTest.exe 1604 QueryNameInformationFile C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\x64\Debug\TDSTest.exe SUCCESS Name: \TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\x64\Debug\TDSTest.exe
11:08:08.5720585 AM TDSTest.exe 1604 CreateFile C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
11:08:08.5721041 AM TDSTest.exe 1604 QueryBasicInformationFile C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll SUCCESS CreationTime: 6/11/2013 6:30:08 PM, LastAccessTime: 6/11/2013 6:30:08 PM, LastWriteTime: 6/12/2013 11:00:28 AM, ChangeTime: 6/12/2013 11:05:51 AM, FileAttributes: A
11:08:08.5721293 AM TDSTest.exe 1604 CloseFile C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll SUCCESS
11:08:08.5722797 AM TDSTest.exe 1604 CreateFile C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll SUCCESS Desired Access: Read Data/List Directory, Execute/Traverse, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: n/a, ShareMode: Read, Delete, AllocationSize: n/a, OpenResult: Opened
11:08:08.5723228 AM TDSTest.exe 1604 CreateFileMapping C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll FILE LOCKED WITH ONLY READERS SyncType: SyncTypeCreateSection, PageProtection:
11:08:08.5724896 AM TDSTest.exe 1604 CreateFileMapping C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll SUCCESS SyncType: SyncTypeOther
11:08:08.5725861 AM TDSTest.exe 1604 Load Image C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll SUCCESS Image Base: 0x7fef7830000, Image Size: 0x6d000
11:08:08.5726385 AM TDSTest.exe 1604 QueryNameInformationFile C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll SUCCESS Name: \TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll
11:08:08.5728910 AM TDSTest.exe 1604 CreateFile C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll SUCCESS Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
11:08:08.5912215 AM TDSTest.exe 1604 CloseFile C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll SUCCESS
Я извиняюсь, что это выглядит немного грязно, я пытался опубликовать здесь фотографию, но оказалось, что у меня недостаточно репутации, чтобы сделать это.
Любое предложение приветствуется.
Обновить
Я проследил до конструктора в ThorDetectorSwitch.dll
, который выглядит следующим образом:
ThorDetectorSwitch::ThorDetectorSwitch() : _mcSwitch(__uuidof(MCLControlClass))
{
_A = WstringToBSTR(L"A");
_B = WstringToBSTR(L"B");
_C = WstringToBSTR(L"C");
_D = WstringToBSTR(L"D");
_deviceDetected = FALSE;
}
Я устанавливаю точку останова в первой скобке, но она никогда не попадает в функцию. Вместо этого он переходит к исключениям. Я полагаю, что-то не так с MCLControlClass
, или же_mcSwitch
?
Я получил ошибку 3765269347
Общая стратегия с большими значениями числа ошибок, как это, заключается в преобразовании их в шестнадцатеричное. 3765269347 == 0xE06D7363. Это магическое число, тоже хорошо гуглится. Одна из стратегий, используемая программистами Microsoft, состоит в том, чтобы сделать последние 3 байта кода исключения ASCII-кодами. 6D7363 == «мск». Недостаточно места для добавления ++ 🙂
Диагностика заключается в том, что функция DllMain () внутри DLL умерла из-за необработанного исключения C ++. Это случается, конечно.
Способ отладки состоит в том, чтобы принудительно остановить отладчик при возникновении исключения, прежде чем загрузчик Windows сможет его перехватить и превратить в код ошибки. В Visual Studio используйте Debug + Exceptions, отметьте флажок Thrown для исключений C ++.
Понимание того, что вы видите, когда отладчик останавливается, во многом зависит от того, есть ли у вас хороший файл PDB для DLL и есть ли у вас исходный код. Источник, как правило, обычно требуется для решения проблемы. Если у вас нет доступа к чему-либо подобному, вам нужна помощь программиста, написавшего эту DLL. Пошлите ему небольшой репроект, который воспроизводит аварию.
Это особенное исключение. Пожалуйста, прочитайте это от MS:
Расшифровка параметров сгенерированного исключения C ++ (0xE06D7363)