1

背景

我有一个嵌入式系统,它运行一个最初用 C++ 编写并在 Visual Studio 中编译的应用程序,这会产生一个可执行文件和 30 多个 DLL。这些库无法在 VS 对象浏览器或 P/Invoke Interop Assistant 等其他工具中浏览。

在 Dependency Walker 中加载一些 DLL 表明它们都缺少依赖关系树深处的一些依赖项(cdfview.dlldwmapi.dllw32topl.dll,...),但根据这个问题,这可能不是问题。

我有一些源代码文件和所有已编译的 DLL。应用程序当前运行没有问题,表明没有真正的依赖问题。

我正在尝试调用一些库函数并最终使用 C# 制作包装器,但即使是最简单的函数也无法成功导入和调用。我总是收到以下错误:

无法加载 DLL 'dllName.dll':动态链接库 (DLL) 初始化例程失败。(HRESULT 异常:0x8007045A)

示例代码 [编辑]

从 C++ 源代码头文件中,我有以下声明:

#define OB_API __declspec(dllexport) __cdecl 

typedef unsigned long DWORD;  // From windef.h
typedef DWORD OBSTATUS;

OBSTATUS OB_API TestObj(void);

在 C++ 源代码文件中给出了以下定义(似乎总是返回true):

BOOL WINAPI DllMain(HANDLE  /* hModule */, 
                      DWORD   ul_reason_for_call, 
                      LPVOID  /* lpReserved */
                      )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_PROCESS_DETACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
        break;
    }
    return TRUE;
}

在我的 C# 应用程序类中,我添加了以下声明:

[DllImport(@"dllName.dll", CallingConvention=CallingConvention.Cdecl)
public static extern ulong TestObj();

DLL 和 C# 应用程序二进制文件位于同一目录中。

问题

通过研究错误,似乎有很多原因可能会引发此特定异常,我想知道如何进一步解决此类问题。

有没有办法获得有关初始化例程失败原因的更详细信息?

(注意:目标系统运行的是 .NET framework 2.0)

4

2 回答 2

4

您正在加载的 DLL 包含一个 DllMain() 函数。这很常见,这样的函数会初始化 DLL 的状态。Windows 确保在加载 DLL 时调用此函数,它会在您第一次调用该 DLL 导出的函数时自动发生。

问题是,该函数返回 FALSE 表示它无法正确初始化 DLL。当然,这并没有给出关于它为什么返回 FALSE 的全部信息。Windows 只能生成错误 1114,ERROR_DLL_INIT_FAILED。如果 DLL 本身不输出任何诊断信息,那么您只能调试代码。从项目+属性开始,调试选项卡,勾选“启用非托管代码调试”选项。

手指交叉,您在“输出”窗口中看到一条消息。赔率不是很好。如果您没有 DLL 的源代码,那么您将需要 DLL 的供应商或作者的帮助。给他一份像这样失败的测试项目的副本。

于 2012-12-18T14:36:01.570 回答
0

也许原因是需要安装旧的 Net Framework 版本,如 2.0、3.0、3.5,....它对我有用:D

于 2022-01-12T02:30:32.653 回答