【问题标题】:C++ Loadlibrary() error 3765269347C++ Loadlibrary() 错误 3765269347
【发布时间】:2013-06-12 15:24:17
【问题描述】:

这个 Loadlibraty() 错误 3765269347 困扰着我。我正在实现一个构建为 x64 的 C++ 控制台应用程序,以加载 x64 本机 C++ dll。以下是 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 的路径是正确的。

我还使用 Monitor Process 来跟踪调用了什么 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 有问题?

【问题讨论】:

  • 如何打印错误代码?
  • 不要对错误做出任何假设,而是查看文档。
  • 得到一个未定义的错误(那个代码)通常意味着库抛出了一个未处理的异常。调试时在输出窗口中没有得到任何东西吗? (假设这里是视觉工作室)
  • 你 100% 确定你的路径是正确的吗?您在代码中显示的加载 .dll 文件的路径是 C:\TDSTest\Debug\ThorDetectorSwitch.dll,而您发送到 .dll 文件的日志中显示的路径是 C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll
  • 这看起来与您的问题非常相似:stackoverflow.com/questions/4428824/…

标签: c++ dll loadlibrary


【解决方案1】:

我的错误是 3765269347

像这样具有较大错误数值的通用策略是将它们转换为十六进制。 3765269347 == 0xE06D7363。这是一个神奇的数字,谷歌也很好。 Microsoft 程序员使用的一种策略是将异常代码的最后 3 个字节设置为 ASCII 代码。 6D7363 == “MSC”。没有足够的空间来添加 ++ :)

诊断结果是 DLL 中的 DllMain() 函数由于未处理的 C++ 异常而死亡。这当然会发生。

调试它的方法是在抛出异常时强制调试器停止,然后操作系统加载程序可以捕获它并将其转换为故障代码。在 Visual Studio 中,使用调试 > 异常,勾选 C++ 异常的抛出复选框。

了解调试器停止时所看到的内容在很大程度上取决于您是否有适合 DLL 的 PDB 文件以及是否有源代码。当然通常需要源来解决问题。如果您无权访问此类内容,那么您确实需要编写该 DLL 的程序员的帮助。向他发送一个重现崩溃的小型重现项目。

【讨论】:

  • 调试部分不太明白。 “抛出异常时强制调试器停止”,我该怎么做?在 Loadlibrary() 处设置断点,然后在 dllmain.cpp 中的某个位置设置另一个断点?
  • 查看窗口顶部的菜单。单击调试。单击例外。将打开一个对话框。勾选 Thrown 复选框。
  • 我明白了。现在我可以进入我的 dll,所以我想我应该从那里开始。非常感谢。
【解决方案2】:

这是一个特殊的例子。请从 MS 阅读: Decoding the parameters of a thrown C++ exception (0xE06D7363)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    相关资源
    最近更新 更多