有没有办法让我在没有头文件的情况下使用来自 VB6 应用程序或 VSC++ 的 dll? 我有 dll 和 .lib,并尝试执行以下操作来加载 dll。
FunctionCalledType calledPTR = NULL;
hDLL = LoadLibrary(_T("called.dll"));
if (hDLL == NULL) {
std::cerr << "DLL called.dll could not be found!";
return 2;
}
calledPTR = (FunctionCalledType)GetProcAddress(hDLL, "FunctionCalled");
if (NULL != calledPTR)
{
std::cout << "Got Function";
calledPTR("fileA.bz", "fileA.txt");
}
else{
std::cerr << "Didn't got function";
return 3;
}
return 0;
代码运行良好,但我在
上遇到内存访问错误 calledPTR("fileA.bz", "fileA.txt");
其中FunctionCalledType定义如下:
typedef string(CALLBACK* FunctionCalledType)(string, string);
生成 dll 的 VB6 代码如下:
Public Function FunctionCalled(src As String, dest As String) As String
//Some code
End Function
我猜我指向函数的指针格式错误,或者我以错误的方式包含了 dll
这些是 VB6.dll 具有的 4 个导出函数。
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
如果您的代码位于类模块中,您可以基于 VB6 的类模块创建一个对象,然后将该函数作为方法调用。
你不想学 COM 就好。这几乎没有机会实现。
注意:VB6 中的字符串始终为
BSTR
,并且您不能使用 std::string
或 string
,具体取决于您使用的语言。
从关于
BSTR
的文档中,BSTR
的定义如下:
typedef WCHAR OLECHAR;
typedef OLECHAR* BSTR;
typedef BSTR* LPBSTR;
并且:
ordinal hint RVA name
1 0 00002EFA DllCanUnloadNow
2 1 00002ECE DllGetClassObject
3 2 00002EE4 DllRegisterServer
4 3 00002EB8 DllUnregisterServer
那么就不可能使用运行时链接来调用。