VC++6.0调用VB.net

VB.ne程序作成

  1. 实装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
    
  2. 向注册表中注册VbClass编译后生成的dll
    C:\Windows\Microsoft.NET\Framework{版本号}>Regasm.exe /codebase VbClass.dll

VC++6.0程序作成

  1. 实装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(&params, 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 = &param3;
                        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, &params, &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);
    }
    
发布了13 篇原创文章 · 获赞 2 · 访问量 818

猜你喜欢

转载自blog.csdn.net/ccblogs/article/details/97805917
今日推荐