【问题标题】:How to call Vb6 dll on VC++ without the header如何在没有标头的情况下在 VC++ 上调用 Vb6 dll
【发布时间】:2015-04-16 15:09:48
【问题描述】:

有没有办法让我使用来自 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 是基于 COM 的,它不导出任何东西(除了 RegisterServer)
  • 这一切似乎都令人难以置信。 VB6 不支持创建非托管 DLL。这似乎不太可能真的是一个 VB6 DLL。当然,您不能将 C++ std::string 映射到 VB String
  • @AlexK。这个 DLL 似乎导出了一个名为 "FunctionCalled" 的函数,因为根据提问者的说法,GetProcAddress 成功了。
  • 到 std::cout
  • @FabioCosta 当你说这个 DLL 是由 VB6 制作时,我根本不相信你。因为,开箱即用,VB6 不能做你声称它可以做的事情。此外,从您尝试的类型映射来看,您似乎对互操作知之甚少。您可能需要认识到自己的知识缺陷并加以纠正。对不起。

标签: visual-c++ dll vb6 dllimport


【解决方案1】:

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

DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer

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

你不想学习 COM 很好。这个工作几乎没有机会。

【讨论】:

  • 我在 DLL 上使用了 Dll ExportViewer,得到了上面的 4 + DllMain 和我想要使用的 FunctionCalled。关于:“您基于 VB6 的类模块创建一个对象,然后将该函数作为方法调用。”你有什么参考吗?喜欢主题上的 msdn 页面?
  • @FabioCosta - 相关的 MSDN 页面是 here
  • 谢谢,我去看看。
猜你喜欢
  • 2014-05-20
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 2012-08-08
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
相关资源
最近更新 更多