• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 1、使用ATL建立一个包含2个接口的COM组件,并在其中一个自动化接口中实现字符串的小写转换(如:将HELLO转换成hello);在另一个普通的接

1、使用ATL建立一个包含2个接口的COM组件,并在其中一个自动化接口中实现字符串的小写转换(如:将HELLO转换成hello);在另一个普通的接

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了 1、使用ATL建立一个包含2个接口的COM组件,并在其中一个自动化接口中实现字符串的小写转换(如:将HELLO转换成hello);在另一个普通的接等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 1、使用ATL建立一个包含2个接口的COM组件,并在其中一个自动化接口中实现字符串的小写转换(如:将HELLO转换成hello);在另一个普通的接
描述:

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
请各位老大帮帮我,小弟感激不尽!!


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 1、使用ATL建立一个包含2个接口的COM组件,并在其中一个自动化接口中实现字符串的小写转换(如:将HELLO转换成hello);在另一个普通的接

相关文章

  • 2017-06-04 ocx上传服务器本地调用问题
  • 2017-06-04 wtl协同浏览
  • 2017-06-05 VC新手冒昧请教:关于查询某进程在电脑中收集哪些信息的问题
  • 2017-06-04 关于ActiveX控件的问题
  • 2017-06-05 GetProcAddress为什么总返回NULL值?
  • 2017-06-05 静态库中调用动态库
  • 2017-06-04 例子都不对,我要疯了
  • 2017-06-04 vc操作word为什么CreateDispatch"WordApplication"总是失败。
  • 2017-06-05 ★★很急迫的问题,关于进程HANDLE和进程ID
  • 2017-06-05 顶层菜单钩子问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • QueryInterface的实现编译通不过
    • hsocket可能为0吗?
    • 急!急!急!哪位好心人帮帮小弟?小弟万分感谢!!!!!!!!!!
    • 如何让IE重新获取打印设置?
    • 分享一个自己写的GIF图片帧分离工具GIFSpilter
    • 双核调用的问题----急
    • 想问一下有哪些WTL的出版书籍
    • 多线程执行正确的部分,现在搬到DLL库里去就不灵了
    • IEtoolbar安装后并不显示出来如何让其安装后,重新启动浏览器,就显示出来?
    • HOOK程序开发时这个错误是怎么回事啊~~~~

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有