COM组件里自动化接口与普通接口的转换

View Code
#include<stdio.h>
#include<iostream>
using namespace std;
#include "huchao.h"
#include "huchao_i.c"
#include "atlbase.h"

int main(int argc, char* argv[])
{
Icom *Imycom; //COM接口1的初始化
HRESULT hResult; //HRESULT返回值用于看函数执行状态
GUID g_clsid; //定义一个标识符
::CoInitialize(NULL);//初始化com库
hResult=CLSIDFromProgID(L"huchao.com",&g_clsid);//获取CLSID
if(FAILED(hResult))
{
printf("CLSIDFromProgID() failed!");
}

//IDispatch *pIDisp;//定义IDispatch 接口指针

hResult = CoCreateInstance(g_clsid,//实例化一个com对象
NULL,
CLSCTX_INPROC_SERVER,
IID_Icom,
(void **)&Imycom);
if(FAILED(hResult))
{
printf("2222");
}
//创建自动化对象并返回IDispatch 接口指针

CComBSTR BSFunName(L"Lower"); // 准备取得 Add 函数的序号 DispID,为了能使用CComBSTR,别忘了头文件#include "atlbase.h"
DISPID dispID; // 定义一个 DISPID序号对象
hResult = Imycom->GetIDsOfNames( // 根据函数名,取得DISPID
IID_NULL,
&BSFunName, // 函数名
1, // BSFunName中的元素个数
LOCALE_SYSTEM_DEFAULT, // 使用系统默认的语言环境
&dispID ); // 返回值DISPID

if (FAILED(hResult))
{
printf("GetIDsOfNames failed!\n");
return -2;
}

VARIANT vResult;
VARIANT str[1];//给字符串赋值

str[0].bstrVal=L"GASD";

DISPPARAMS dispParams = {str,NULL,1,0}; // 把参数包装在这个结构中
hResult = Imycom->Invoke( // 调用Invoke方法
dispID, // 指定dispID
IID_NULL,
LOCALE_SYSTEM_DEFAULT, // 使用系统默认的语言环境
DISPATCH_METHOD, // 调用的是方法,不是属性
&dispParams, // 参数
&vResult, // 返回值
NULL, // 不考虑异常处理
NULL);


if(FAILED(hResult))
{
printf("3333");
return 0;
}

printf("转化后的字符串:%ls\n",vResult.bstrVal);

Icom2 *Imycom2;
hResult=Imycom->QueryInterface(IID_Icom2, (void**)&Imycom2);//使用QueryInterface()使用进行切换

double temp;

hResult=Imycom2->div(2,2,&temp);

if(FAILED(hResult))
{
printf("55555");
return 0;
}

printf("%lf\n",temp);

hResult=Imycom2->square(2,2,2,&temp);

if(FAILED(hResult))
{
printf("55555");
return 0;
}
printf("%lf\n",temp);

return 0;
}

开始用IDispatch接口进行字符串的小写转换调用,

两个接口之间使用QueryInterface()使用进行切换:从接口1转到接口2

原文地址:https://www.cnblogs.com/huhuuu/p/2295902.html