从非托管 DLL 导入函数时,0x8007007F 是啥意思?

Posted

技术标签:

【中文标题】从非托管 DLL 导入函数时,0x8007007F 是啥意思?【英文标题】:What does 0x8007007F mean when importing a function from an unmanaged DLL?从非托管 DLL 导入函数时,0x8007007F 是什么意思? 【发布时间】:2017-08-17 09:43:19 【问题描述】:

我正在尝试将非托管 DLL 中的函数导入到我的 C# 程序中。

这是我的代码:

[DllImport("MarkEzd.dll", EntryPoint = "lmc1_Initial2", CharSet = CharSet.Unicode,
    CallingConvention = CallingConvention.StdCall)]
public static extern int piplmc1_Initial(string PathName, bool TestMode);

....

int intlmc1_Initial = piplmc1_Initial(m_strEzCADSotwareFullPath, false);
if (intlmc1_Initial > 0)

   return;

错误是,翻译自法语:

无法加载 DLL MarkEzd.dll,找不到指定的过程 Exception de HRESULT : 0x8007007F

这个错误是什么意思?

【问题讨论】:

你看过 www.pinvoke.net 吗? kernal32.dll 方法有示例代码。只有公开的方法才能使用 DllImport 访问。有时方法的名称会略有变化,因此 DLL 导出查看器应该给出正确的名称。确保 dll 在用于编译的文件夹中。您可能同时拥有调试和发布文件夹,并且 dll 必须位于正确的文件夹中。请发布您收到的错误消息。 问题中的信息不正确。错误代码 127 是 ERROR_PROC_NOT_FOUND,在调用 GetProcAddress 后得到。此外,您为什么要调用 LoadLibrary 来加载 DLL,但对 piplmc1_Initial(该 DLL 中的一个函数)使用 p/invoke。如果您执行后者,则无需显式使用LoadLibrary,框架会为您处理。看来你并没有告诉我们整个故事。请弄清楚事实,并显示minimal reproducible example。 嗨,关于 DLL Export Viewer 的名称似乎是正确的,当然 DLL 文件在调试文件夹中(我目前只使用这个文件夹)。 之前通过加载库Lmc1,没有错误但hEzdDLL上没有句柄。我没有加载 Lmc1,消息是法语,但告诉我在 dll Lmc1 中找不到入口点。 大卫,正如我所写,我不熟悉图书馆,我肯定做错了,我试图告诉你真实的整个故事;-) 所以我将删除 LoadLibrary,正如你所说第一个DLLImport就够了,那就说明这部分不行…… 如果您只提供部分图片,我们无法为您提供详细帮助。请编辑问题以获得准确和完整的事实。看起来你一直在破解,随意尝试一些东西,并在破解之后发布了一些摘录。通常,这种反复试验只会让我们感到困惑,并使您的代码变得更糟!细节很重要。 【参考方案1】:

错误消息告诉您,您加载的 DLL 没有导出名为 lmc1_Initial2 的函数。

你应该仔细检查这个库的文档,也许错误在哪里会很明显。也许另一个 DLL 会导出该函数。也许这个名字被错误地转录了。请注意,字母大小写很重要,因此您必须正确输入所有大小写字母。

如果文档没有帮助,请使用 dumpbin 或 Dependency Walker 之类的工具来检查 DLL 的导出函数名称。

【讨论】:

好的,所以我将返回我的应用程序并搜索它。有些东西很奇怪,当我打开 Lmc1.dll 时,我可以在每个函数之前看到“公共”或“受保护”,但对于 MarkEzd.dll,前面什么都没有,这是否意味着该函数没有被导出? 你在什么时候打开DLL? 使用 Dependency Walker。 导出函数列表是完整的导出列表,名称就是名称。如果 DLL 开发人员在前面填充了 private 或 protected,或者某些名称修改器这样做了,这就是函数的调用。 最后一个问题,然后我会在我这边工作,这个异常意味着它无法仅在 dll 中找到函数,或者它可以告诉 DllImport 参数类型或转换错误C++ 到 C# ?

以上是关于从非托管 DLL 导入函数时,0x8007007F 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

从非托管进程中卸载 .NET DLL

用于导入 C++ DLL 的工具

从非托管代码传递指针

gcServer 设置未从非托管 exe 传递到托管 dll

将指针从非托管代码返回到托管代码

从非托管 C++ mfc active x dll 启动 C# 对话框