代码之家  ›  专栏  ›  技术社区  ›  Tim Ring

从VB6调用DLL函数

  •  2
  • Tim Ring  · 技术社区  · 17 年前

    我宣布我的所有公共职能如下:

    #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


    3 回复  |  直到 13 年前
        1
  •  4
  •   Konrad Rudolph    17 年前

    利用 __declspec 对于导出,将导出函数名 弄坏 ,即包含类型信息,帮助C++编译器解决重载。

    export definition VC++中的文件。导出定义文件非常简单,只包含DLL的名称和导出函数的列表:

    LIBRARY mylibname
    EXPORTS
        myfirstfunction
        secondfunction
    

    此外,还必须指定 stdcall

        2
  •  3
  •   Re0sless    17 年前

    尝试在末尾添加u stdcall

    #define MYDCC_API __declspec(dllexport) __stdcall
    

        3
  •  0
  •   tracker    16 年前

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

    公共函数vbConcat(ByVal a作为字符串,ByVal b作为字符串)作为字符串 vbConcat=a&B 端函数

    您已经在VB6项目属性和中将项目名称设置为VBTestLib

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

    现在你的C++代码:

    #导入“F:\proj\VB6\activexdl\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);
       }
    

    这就是一切,开始吧。