VB.ne程序作成
-
实装VbClass.vb类
Imports System.Runtime.InteropServices <ClassInterface(ClassInterfaceType.None)> Public Class VbClass Public Function vb_function(ByRef strIn1 As String, ByRef strIn2 As String, ByVal lIn As Long, ByRef strOut1 As String) As Integer ' VB代码中输出信息到控制台 Console.WriteLine("This id VbClass.vb_function {0}", strIn1) Console.WriteLine("This id VbClass.vb_function {0}", strIn2) ' 设定返回VC++6.0程序的参数的值 strOut1 = strIn1 + strIn2 lIn = 888 ' 返回处理结果Code Return 0 End Function End Class
-
向注册表中注册VbClass编译后生成的dll
C:\Windows\Microsoft.NET\Framework{版本号}>Regasm.exe /codebase VbClass.dll
VC++6.0程序作成
- 实装VC++6.0类
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #include <objbase.h> // COM : 与VB.NET接续必要的头部文件 #include <comutil.h> // BSTR <-> char変換に必要 #pragma comment(lib, "comsupp.lib") // 获取编译器信息 - VC++6.0的情况下使用 // #pragma comment(lib, "comsuppw.lib") 获取编译器信息 - VC++6.0以外的情况下使用 #define VB_DLL // VB.NET的场合 #pragma warning(disable : 4996) // 消除C4996(strcpy过时等)警告 void main() { HRESULT h_result; // 返回结果值 CLSID clsid; // 类名 BSTR bstr_dll; // 项目.类名 char* strIn1 = "字符串1"; // 第一个参数 char* strIn2 = "字符串2"; // 第二个参数 char strBuf[128]; // 参数返回值 char buf[128]; int ret = 0; BSTR bstr1 = _com_util::ConvertStringToBSTR(strIn1); // 第一个参数 BSTR bstr2 = _com_util::ConvertStringToBSTR(strIn2); // 第二个参数 long param3 = 999; // 第三个参数 BSTR bstr4 = _com_util::ConvertStringToBSTR(strBuf); // 参数返回值 // 初始化Com CoInitialize(NULL); // 从ProgID中取得CLSID - 从注册表HKEY_CLASSES_ROOT\中注册的DLL( ActiveX )中取得 #ifdef VB_DLL bstr_dll = _com_util::ConvertStringToBSTR("VbApp.VbClass"); #else bstr_dll = _com_util::ConvertStringToBSTR("CsApp.CsClass"); #endif h_result = CLSIDFromProgID(bstr_dll, &clsid); if (SUCCEEDED(h_result)) { // 创建实例 IUnknown* pUnk = NULL; h_result = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)& pUnk); if (SUCCEEDED(h_result)) { // 获得接口 IDispatch* pDisp = NULL; h_result = pUnk->QueryInterface(IID_IDispatch, (void**)& pDisp); if (SUCCEEDED(h_result)) { // 获得方法 DISPID dispid = 0; #ifdef VB_DLL OLECHAR* func_name[] = { L"vb_function" }; #else OLECHAR* func_name[] = { L"cs_function" }; #endif h_result = pDisp->GetIDsOfNames(IID_NULL, func_name, 1, LOCALE_SYSTEM_DEFAULT, &dispid); if (SUCCEEDED(h_result)) { // 参数传递 DISPPARAMS params; ::memset(¶ms, 0, sizeof(DISPPARAMS)); params.cNamedArgs = 0; params.rgdispidNamedArgs = NULL; params.cArgs = 4; // 参数个数 VARIANTARG* pVarg = new VARIANTARG[params.cArgs]; // 参数传递时,倒序传递 // 不需要类型参照传递的场合,不需要VT_BYREF // VT_I2 : short, VT_I4 : long, VT_BSTR : BSTR pVarg[0].vt = VT_BYREF | VT_BSTR; pVarg[0].pbstrVal = &bstr4; // 第一个参数实际是调用方法的最后一个参数 pVarg[1].vt = VT_BYREF | VT_I4; pVarg[1].plVal = ¶m3; pVarg[2].vt = VT_BYREF | VT_BSTR; pVarg[2].pbstrVal = &bstr2; pVarg[3].vt = VT_BYREF | VT_BSTR; pVarg[3].pbstrVal = &bstr1; params.rgvarg = pVarg; // 返回值 VARIANT vRet; VariantInit(&vRet); // 调用Vb.net COM pDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, ¶ms, &vRet, NULL, NULL); ret = vRet.lVal; if (ret == 0) // 检查从Vb.net或者Cs.net返回的值 { char* psz1; char* psz2; char* psz4; psz1 = _com_util::ConvertBSTRToString((BSTR)bstr1); psz2 = _com_util::ConvertBSTRToString((BSTR)bstr2); psz4 = _com_util::ConvertBSTRToString((BSTR)bstr4); char* psz; psz = _com_util::ConvertBSTRToString((BSTR)bstr1); printf("pVarg->bstrVal 1 : %s\n", psz); psz = _com_util::ConvertBSTRToString((BSTR)bstr2); printf("pVarg->bstrVal 2 : %s\n", psz); printf("pVarg->bstrVal 3 : %d\n", param3); psz = _com_util::ConvertBSTRToString((BSTR)bstr4); printf("pVarg->bstrVal 4 : %s\n", psz); delete[] psz; } else { sprintf(buf, "从Vb.net或者Cs.net的返回值 %d\n", ret); ret = -5; } delete[] pVarg; } else { ret = -4; } pDisp->Release(); } else { ret = -3; } pUnk->Release(); } else { ret = -2; } } else { ret = -1; } // 关闭COM CoUninitialize(); // 释放BSTR内存 SysFreeString(bstr1); SysFreeString(bstr2); SysFreeString(bstr4); }