VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 949|回复: 4

1、使用ATL建立一个包含2个接口的COM组件,并在其中一个自动化接口中实现字符串的小写转

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-2-18 09:00:02 | 显示全部楼层 |阅读模式
1、使用ATL建立一个包含2个接口的COM组件,并在其中一个自动化接口中实现字符串的小写转换(如:将HELLO转换成hello);在另一个普通的接口中实现2个方法:两数之间的减法(如:a-b)和两数之间的除法(如:a/b);参数类型自行设计。
        2、使用VC Win32 Console Application进行客户程序的开发,达到调用该组件中这3个方法的目的。(必须通过IDispatch接口进行字符串的小写转换调用,两个接口之间使用QueryInterface()使用进行切换,然后通过Vtable直接调用普通COM接口中的减法和除法调用,自行选取原始接口指针或智能指针)。
以下
是小弟的用户程序:
#include<atlbase.h>
#include<comutil.h>
#include<iostream.h>

#import "E:\ATLPjcts\Level_C\Debug\Level_C.dll"

int main(int argc, char* argv[])
{
        HRESULT hResult;
        hResult = CoInitialize(NULL);
        if (FAILED(hResult))
        {
                cout<<"Initialize COM library failed!\n";
                return -1;
        }
        GUID Clisd;
        hResult = ::CLSIDFromProgID(L"Level_C.MyIntface", &Clisd);
        if (FAILED(hResult))
        {
                cout<<"Can't find the CLSID!\n";
                return -2;
        }
        IDispatch * pIDisp = NULL;
        hResult = CoCreateInstance(Clisd, NULL,
                CLSCTX_INPROC_SERVER, IID_IDispatch, (void **)&pIDisp);
        if (FAILED(hResult))
        {
                cout<<"Create object failed!\n";
                return -2;
        }


        /////////////////////////////////////////////////////////////////////////////////////

        CComBSTR BSFunName1(L"Upper");        // 准备取得 Upper 函数的序号 DispID
        DISPID dispID1;                                        // DispID序号
        hResult = pIDisp->GetIDsOfNames(// 根据函数名,取得序号的函数
                IID_NULL,
                &BSFunName1,                                // 函数名称
                1,                                                        // BSFunName3中的元素个数
                LOCALE_SYSTEM_DEFAULT,                // 使用系统默认的语言环境
                &dispID1);                                        // 返回值
        if (FAILED(hResult))
        {
                cout<<"GetIDsOfNames failed!\n";
                return -2;
        }
       
        VARIANTARG bstr[1];                                        // 所需要的参数
        bstr[0].vt = VT_BSTR;                bstr[0].bstrVal = SysAllocString(L"hello world");        // 参数
       
        DISPPARAMS dispParams1 = { bstr, NULL, 1, 0 };        // 把参数包装在这个结构中
        VARIANT Result1;                                                                // 结果
       
        hResult = pIDisp->Invoke(        // 调用
                dispID1,                                // 函数由 dispID 指定
                IID_NULL,
                LOCALE_SYSTEM_DEFAULT,        // 使用系统默认的语言环境
                DISPATCH_METHOD,                // 调用的是方法,不是属性
                &dispParams1,                        // 参数
                &Result1,                                // 返回值
                NULL,                                        // 不考虑异常处理
                NULL);                                        // 不考虑错误处理
        if (FAILED(hResult))
        {
                printf("Invoke failed!\n");
                return -2;
        }
       
        char *p=_com_util::ConvertBSTRToString(Result1.bstrVal);
        cout<<p<<endl;
////////////////////////////////////////////////////////////////////////////////////////////////////
        IMyMethod * pIMyMethod;
        IMyIntface * pIMyIntface;
        long a=890,b=90;
        long result2;
        hResult = pIDisp->QueryInterface(IID_IMyIntface,(void**)pIMyIntface);
        if(FAILED(hResult))
        {
                cout<<"queryintface IMyIntface is failed!\n";
                return -2;
        }

        hResult = pIMyIntface->QueryInterface(IID_IMyMethod,(void**)pIMyMethod);
        if(FAILED(hResult))
        {
                cout<<"queryintface IMyMethod is failed!\n";
                return -2;
        }
        result2=pIMyMethod->Sub(a,b);
        cout<<"a - b = "<<result2<<endl;


        pIDisp->Release();
        CoUninitialize();
        return 0;
}



错误是:
E:\ATLPjcts\test\test.cpp(73) : error C2065: 'IMyMethod' : undeclared identifier
E:\ATLPjcts\test\test.cpp(73) : error C2065: 'pIMyMethod' : undeclared identifier
E:\ATLPjcts\test\test.cpp(73) : warning C4552: '*' : operator has no effect; expected operator with side-effect
E:\ATLPjcts\test\test.cpp(74) : error C2065: 'IMyIntface' : undeclared identifier
E:\ATLPjcts\test\test.cpp(74) : error C2065: 'pIMyIntface' : undeclared identifier
E:\ATLPjcts\test\test.cpp(74) : warning C4552: '*' : operator has no effect; expected operator with side-effect
E:\ATLPjcts\test\test.cpp(77) : error C2065: 'IID_IMyIntface' : undeclared identifier
E:\ATLPjcts\test\test.cpp(84) : error C2227: left of '->QueryInterface' must point to class/struct/union
E:\ATLPjcts\test\test.cpp(84) : error C2065: 'IID_IMyMethod' : undeclared identifier
E:\ATLPjcts\test\test.cpp(90) : error C2227: left of '->Sub' must point to class/struct/union

请各位老大帮帮我,小弟感激不尽!!
回复

使用道具 举报

0

主题

8

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-4-25 15:15:01 | 显示全部楼层
#import "E:\ATLPjcts\Level_C\Debug\Level_C.dll"  no_namespace

否则,你就要加上命名空间,可以察看你的程序里
回复

使用道具 举报

0

主题

3

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-21 12:30:01 | 显示全部楼层
好复杂,看不太懂。
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-24 21:15:01 | 显示全部楼层
支持mac1234的说法
另外,你程序中没有使用智能指针,也可以直接包含头文件
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-7-25 16:30:01 | 显示全部楼层
有的时候并不需要在你的组件中实现自动化接口!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表