如何在VC++上调用没有头文件的Vb6 dll

问题描述 投票:0回答:2

有没有办法让我在没有头文件的情况下使用来自 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

visual-c++ dll vb6 dllimport
2个回答
1
投票

这些是 VB6.dll 具有的 4 个导出函数。

DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer

如果您的代码位于类模块中,您可以基于 VB6 的类模块创建一个对象,然后将该函数作为方法调用。

你不想学 COM 就好。这几乎没有机会实现。


0
投票

注意:VB6 中的字符串始终为

BSTR
,并且您不能使用
std::string
string
,具体取决于您使用的语言。

关于

BSTR
的文档中,
BSTR
的定义如下:

typedef WCHAR OLECHAR;
typedef OLECHAR* BSTR;
typedef BSTR* LPBSTR;

并且:

  • 您以错误的方式调用指针。
  • 这是示例 DLL 中导出函数的列表:
   ordinal hint RVA      name

         1    0 00002EFA DllCanUnloadNow
         2    1 00002ECE DllGetClassObject
         3    2 00002EE4 DllRegisterServer
         4    3 00002EB8 DllUnregisterServer

那么就不可能使用运行时链接来调用。

© www.soinside.com 2019 - 2024. All rights reserved.