【问题标题】:Calling DLL functions from VB6从 VB6 调用 DLL 函数
【发布时间】:2010-09-07 13:21:35
【问题描述】:

我有一个用 C/C++ 编写的 Windows DLL(所有导出的函数都是“C”)。 DLL 在 VC++ 中对我来说很好用。我已将 DLL 提供给另一家在 VB 中进行所有开发的公司。他们似乎在链接到这些功能时遇到了问题。我十年没用过VB了,我什至没有安装它。可能是什么问题?

我已将所有公共函数声明如下:

#define MYDCC_API __declspec(dllexport)


MYDCCL_API unsigned long MYDCC_GetVer( void);
.
.
.

有什么想法吗?


今天终于回到了这个问题并让它工作。答案让我走上了正确的道路,但我发现这最有帮助:

http://www.codeproject.com/KB/DLL/XDllPt2.aspx

另外,我在将字符串传递给 DLL 函数时遇到了一些问题,我发现这很有帮助:

http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml


【问题讨论】:

    标签: c++ c vb6


    【解决方案1】:

    通过使用__declspec 导出,函数名将被导出mangled,即包含帮助 C++ 编译器解决重载的类型信息。

    VB6 无法处理错位的名称。作为一种解决方法,您必须消除名称。最简单的解决方案是使用 VC++ 中的export definition 文件链接 DLL 文件。导出定义文件非常简单,只包含 DLL 的名称和导出函数的列表:

    LIBRARY mylibname
    EXPORTS
        myfirstfunction
        secondfunction
    

    此外,您必须指定 stdcall 调用约定,因为这是 VB6 可以处理的唯一调用约定。有一个项目使用程序集注入来处理 C 调用,但我想您不想使用这种困难且容易出错的方法。

    【讨论】:

      【解决方案2】:

      尝试在末尾添加 __stdcall

      #define MYDCC_API __declspec(dllexport) __stdcall
      

      我们有一些 C++ dll 与我们的旧 VB6 应用程序交互,它们最后都有。

      【讨论】:

        【解决方案3】:

        VB6 DLL 始终是 COM dll。我将用尽可能少的文字描述一个例子。假设您在 VB6 中有一个 ActiveX DLL 项目,其中有一个名为 CTest 的类,其中包含如下所示的方法

        公共函数 vbConcat(ByVal a As String, ByVal b As String) As String vbConcat = a & b 结束函数

        并且您已在 VB6 项目属性中将项目名称设置为 VBTestLib,并且 您已将项目编译为 F:\proj\VB6\ActiveXDLL\VBTestDLL.dll

        您需要使用 Windows 命令注册 dll regsvr32 F:\proj\VB6\ActiveXDLL\VBTestDLL.dll

        现在你的 C++ 代码:

        #import "F:\proj\VB6\ActiveXDLL\VBTestDLL.dll" 使用命名空间 VBTestLib;

        void CDialogTestDlg::OnButton1() {

         HRESULT hresult;
         CLSID clsid;
         _CTest *t; // a pointer to the CTest object
         _bstr_t bstrA = L"hello";
         _bstr_t bstrB = L" world"; 
         _bstr_t bstrR;
         ::CoInitialize(NULL);
          hresult=CLSIDFromProgID(OLESTR("VBTestLib.CTest"), &clsid);
          hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                                       __uuidof(_CTest),(LPVOID*) &t);
          if(hresult == S_OK)
          {
             bstrR  = t->vbConcat(bstrA , bstrB);
             AfxMessageBox((char*)bstrR);
           }
        

        }

        这就是它的全部内容,开始吧。

        【讨论】:

        • 你搞错了。问题是从 C++ 导出并导入到 VB6。
        猜你喜欢
        • 1970-01-01
        • 2011-12-19
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-17
        • 2023-03-31
        相关资源
        最近更新 更多