C++ 中的 DLL 导出调用,带有“::”字符串名称
Posted
技术标签:
【中文标题】C++ 中的 DLL 导出调用,带有“::”字符串名称【英文标题】:DLL export call in C++ with "::" string names 【发布时间】:2019-07-10 00:33:20 【问题描述】:我有一个函数名称为“Test123::MyFunction”的外部 DLL 文件,这里的问题是如果名称不包含“::”字符,我可以成功调用 DLL 名称,我如何传递完整的函数在 DLL 调用中命名“Test123::MyFunction”?
完整的源代码:
#include "pch.h"
#include <stdio.h>
#include <Windows.h>
#include <iostream>
int MyFunction(char* buf);
int main(int argc, char** argv)
/* get handle to dll */
HINSTANCE hGetProcIDDLL = LoadLibrary(L"CallMe.dll");
/* get pointer to the function in the dll*/
FARPROC lpfnGetProcessID = GetProcAddress(HMODULE(hGetProcIDDLL), "MyFunction"); // Here the name MyFunction should be Test123::MyFunction
typedef int(__stdcall * pICFUNC)(char *);
pICFUNC MyFunction;
MyFunction = pICFUNC(lpfnGetProcessID);
/* The actual call to the function contained in the dll */
int intMyReturnVal = MyFunction(argv[1]);
/* Release the Dll */
FreeLibrary(hGetProcIDDLL);
return intMyReturnVal;
/* The return val from the dll */
谢谢
【问题讨论】:
GetProcAddress
-- 就其预期而言,这是一个非常简单的函数。您使用的名称必须与导出的名称完全匹配。这包括大小写和特殊字符。显然,您误认为正确的导出名称。使用 Dependency Walker 或 dumpbin 等工具获取确切名称。
See this answer
【参考方案1】:
在可视化 C++ 安装中,应该有一个名为 dumpbin.exe 的小实用程序。如果你把它扔到你的 C++ DLL 中,你应该能够列出你导出的 C++ 方法的错误名称。就是您要传递给 GetProcAddress 的那些文本名称。
然而,大多数人会通过简单地执行以下操作来禁用对导出函数的名称修改:
extern "C" void __declspec(dllexport) startPicadorVisual(string fixtureNamet);
extern "C" PicadorResults __declspec(dllexport) getPicadorReading(string fixtureName);
这会将函数的名称导出为“startPicadorVisual”和“getPicadorReading”。注意:当使用 C 命名约定导出函数时,这意味着您将无法使用函数重载(因为这两个函数最终将使用相同的名称)。
【讨论】:
以上是关于C++ 中的 DLL 导出调用,带有“::”字符串名称的主要内容,如果未能解决你的问题,请参考以下文章