总结一下在VC中调用COM组件的方法+++VC调用远程COM+组件

C语言调用COM组件 2019独角兽企业重金招聘Python工程师标准>>> ... 阅读详情

总结一下在VC中调用COM组件的方法

准备及条件:

COM服务器为进程内服务器,DLL名为simpCOM.dll,该组件只有一个接口IFoo,该接口只有一个方法HRESULT SayHello(void)


在SDK中调用

=====================================

一、最简单最常用的一种,用#import导入类型库,利用VC提供的智能指针包装类

演示代码:


#import "D:\Temp\vc\simpCOM\Debug\simpCOM.dll" no_namespace

CoInitialize(NULL);


IFooPtr spFoo = NULL;

spFoo.CreateInstance(__uuidof(Foo));

spFoo->SayHello();

spFoo.Release();/*晕死了,本来智能指针就是为了让用户不用关心这个的,可是我发现如果不手工调用一下的话,程序退出后会发生内存访问错误,我是在console中做试验的,哪位大侠知道怎么回事请一定指教*/

CoUninitialize();

二、引入midl.exe产生的*.h,*_i.c文件,利用CoCreateInstance函数来调用

演示代码:

/*在工程中加入*_i.c文件,例如本例的simpCOM_i.c,该文件定义了类和接口的guid值,如果不引入的话,会发生连接错误。*/

#include "D:\Temp\vc\simpCOM\simpCOM.h"

CoInitialize(NULL);

IFoo* pFoo = NULL;

HRESULT hr = CoCreateInstance(CLSID_Foo, NULL, CLSCTX_ALL, IID_IFoo, (void**)&pFoo);

if (SUCCEEDED(hr) && (pFoo != NULL))

{

       pFoo->SayHello();

       pFoo->Release();

}

CoUninitialize();

三、不用CoCreateInstance,直接用CoGetClassObejct得到类厂对象接口,然后用该接口的方法CreateInstance来生成实例。

演示代码:

/*前期准备如二方法所述*/

IClassFactory* pcf = NULL;

HRESULT      hr = CoGetClassObject(CLSID_Foo, CLSCTX_ALL, NULL, IID_IClassFactory, (void**)&pcf);

if (SUCCEEDED(hr) && (pcf != NULL))

{

       IFoo* pFoo = NULL;

       hr = pcf->CreateInstance(NULL, IID_IFoo, (void**)&pFoo);

       if (SUCCEEDED(hr) && (pFoo != NULL))

       {

              pFoo->SayHello();

              pFoo->Release();

       }

       pcf->Release();

}

四、不用CoCreateInstance or CoGetClassObject,直接从dll中得到DllGetClassObject,接着生成类对象及类实例(本方法适合于你想用某个组件,却不想在注册表中注册该组件)


演示代码:

/*前期准备工作如二方法所述,事实上只要得到CLSID和IID的定义及接口的定义就行*/

typedef HRESULT (__stdcall * pfnGCO) (REFCLSID, REFIID, void**);

pfnGCO fnGCO = NULL;

HINSTANCE hdllInst = LoadLibrary("D:\\Temp\\vc\\simpCOM\\Debug\\simpCOM.dll");

fnGCO = (pfnGCO)GetProcAddress(hdllInst, "DllGetClassObject");

if (fnGCO != 0)

{

       IClassFactory* pcf = NULL;

       HRESULT hr=(fnGCO)(CLSID_Foo, IID_IClassFactory, (void**)&pcf);

       if (SUCCEEDED(hr) && (pcf != NULL))

       {

              IFoo* pFoo = NULL;

              hr = pcf->CreateInstance(NULL, IID_IFoo, (void**)&pFoo);

              if (SUCCEEDED(hr) && (pFoo != NULL))

              {

                     pFoo->SayHello();

                     pFoo->Release();

              }

              pcf->Release();

       }

}    

FreeLibrary(hdllInst);


在MFC中调用

=====================================

在MFC中除了上面的几种方法外,还有一种更方便的方法,就是通过ClassWizard利用类型库生成包装类,不过有个前提就是com组件的接口必须是派生自IDispatch


具体方法:

1、按Ctrl+W调出类向导,按Add Class按钮弹出新菜单,选From a type libarary,然后定位到simpCOM.dll,接下来会出来该simpCOM中的所有接口,选择你想生成的接口包装类后,向导会自动生成相应的.cpp和.h文件.

这样你就可以在你的MFC工程中像使用普通类那样使用COM组件了.

演示代码:


       CoInitialize(NULL);

       IFoo foo;

       if (foo.CreateDispatch("simpCOM.Foo") != 0)

       {

              foo.SayHello();

              foo.ReleaseDispatch();

       }

      

       CoUninitialize();


―――――――――――――――――――――――――――――――――――――――

不好意思,不小心发出去了。


_foo,我觉得不一定要调用Release,估计原因是因为spFoo智能指针对象在CoUninitialize()函数以后调用引起的。要是如下面这样调用,应该就没有问题了。

#import "D:\Temp\vc\simpCOM\Debug\simpCOM.dll" no_namespace

CoInitialize(NULL);

{

   IFooPtr spFoo = NULL;

   spFoo.CreateInstance(__uuidof(Foo));

   spFoo->SayHello();

}

CoUninitialize();

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/sinall/archive/2005/04/23/359555.aspx总结一下在VC中调用COM组件的方法

VC调用远程COM+组件


用VB6向导做成COM+,并在服务器上安装,部分代码如下:(名称为ADOMTS) 
Public Function GetADORecordset() As ADOR.Recordset 
Dim rsset As ADODB.Recordset 
Dim cn As ADODB.Connection 
Dim connectstring As String 
Dim anerror As ADODB.Error 
Dim Sql As String 
On Error GoTo rt 
connectstring = "Driver={SQL SERVER};Server=192.168.1.123;Database=pubs;UID=sa;" 
Sql = "SELECT * FROM authors;" 
Set cn = New ADODB.Connection 
cn.ConnectionString = connectstring 
cn.CursorLocation = adUseClient 
cn.Open 
Set rsset = cn.Execute(Sql) 
Set GetADORecordset = rsset 
Exit Function 
rt: 
For Each anerror In cn.Errors 
Debug.Print anerror.Number & ": " & anerror.Description & " - " & anerror.SQLState 
Next anerror 
End Function 

然后用VC6封装DLL(工程名为connect),远程调用COM+组件(将服务器上的组件导出并在客户端上安装)。利用VC MFC 

CLASSWIZARD添加新类,import from type library,将ADOMTS.tlb添加进去。部分代码如下: 
int _stdcall GETUSPW() 
{ 

_clsAdoRec * pAccount; 
IUnknown *pUnknown; 
HRESULT hr; 
CoInitialize(NULL);//初始化COM环境 
hr = CoInitializeSecurity( 
NULL, //Points to security descriptor 
-1, //Count of entries in asAuthSvc 
NULL, //Array of names to register 
NULL, //Reserved for future use 
RPC_C_AUTHN_LEVEL_DEFAULT, //The default authentication level for proxies 
RPC_C_IMP_LEVEL_IDENTIFY, //The default impersonation level for proxies 
NULL, //Reserved; must be set to NULL 
0, //Additional client or server-side capabilities 
NULL //Reserved for future use 
); 

COAUTHINFO sAuthInfo; 
sAuthInfo.dwAuthnSvc = RPC_C_AUTHN_DEFAULT; 
sAuthInfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL_DEFAULT; 
//sAuthInfo.dwAuthzSvc = RPC_C_AUTHZ_DEFAULT; 
sAuthInfo.dwAuthzSvc = RPC_C_AUTHZ_NONE; 
// sAuthInfo.dwCapabilities = EOAC_NONE;//must be 
sAuthInfo.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;//must be 
sAuthInfo.pwszServerPrincName = NULL; 
sAuthInfo.pAuthIdentityData = (COAUTHIDENTITY*)malloc(sizeof(COAUTHIDENTITY)); 
sAuthInfo.pAuthIdentityData->User = L"test" ;//访问远程对象所在主机的用户名,宽字符串 
sAuthInfo.pAuthIdentityData->UserLength =4; //用户名的字符长度 
sAuthInfo.pAuthIdentityData->Password = L"test" ;//密码,宽字符串 
sAuthInfo.pAuthIdentityData->PasswordLength = 4; //密码长度 
sAuthInfo.pAuthIdentityData->Domain = NULL; //远程主机的域,如果没有域则设置为NULL 
sAuthInfo.pAuthIdentityData->DomainLength = 0;//域名长度 
sAuthInfo.pAuthIdentityData->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; 
COSERVERINFO serverInfo; 
memset(&serverInfo, 0, sizeof(COSERVERINFO)); 
serverInfo.pwszName = L"192.168.1.10"; //远程主机的名称 
serverInfo.pAuthInfo = &sAuthInfo; 
MULTI_QI qi; 
memset(&qi, 0, sizeof(MULTI_QI)); 
qi.pIID = &IID_IUnknown; 

CLSID CLSID_InsideCOM = {0xAB363305,0x981B,0x11D1,{0x92,0x92,0x00,0xAA,0x00,0x51,0x0E,0x3B}}; 
const IID IID_IAccount={0xB363304,0x981B,0x11D1,{0x92,0x92,0x00,0xAA,0x00,0x51,0x0E,0x3B}}; 

hr=CoCreateInstanceEx(CLSID_InsideCOM,NULL,CLSCTX_REMOTE_SERVER,&serverInfo,1,&qi); 
pUnknown = (IUnknown *) qi.pItf; 
hr = pUnknown->QueryInterface(IID_IAccount,(void**)&pAccount); 
pAccount->GetADORecordset(); 
pUnknown->Release(); 


return 0; 


} 
调用该DLL,单步调试的时候,程序走到CoCreateInstanceEx函数时候没有问题,接着执行接口查询操作 

QueryInterface,hr返回0x80070005,访问被拒绝。实在弄不明白,都已经CoCreateInstanceEx成功了,为什么 QueryInterface不成功呢?是我代码写的有问题吗?



http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449


C语言实现COM组件 简单使用纯C语言实现COM组件,帮助理解COM实现机制 立即下载

相关推荐

vc++拖拽功能代码示例

供初学者学习VC之用,实现基础的文件拖拽功能

VC调用COM的方法总结

转载请标明是引用于 http://blog.youkuaiyun.com/chenyujing1234    源码下载地址(采用VS2005+Win32): http://www.rayfile.com/zh-cn/files/fc8fa0f8-df8f-11e1-8c83-0015c55db73d/   在文章采用ATL模型代替lib dll 的调用>>中我介绍了VC中调用COM的两种方法: (

chenyujing1234的专栏 6737

VC++语言编写,枚举当前系统中的所有RS232串口.zip

嵌入式软件开发上位机

vc调用com方法

介绍在VC++ 6.0下编写COM客户程序的三种方法,虽然每一种方法都可以达到使用代码组件的目的,但详细了解并掌握所有方法会为根据具体情况选择适当方法提供更大的余地。 1、COM库函数 利用COM库函数使用代码组件的方法是介绍的三种方法中实现起来最麻烦和困难的方法。它要求开发人员必须具有对COM原理的深入理解。该方法实现步骤如下: 首先添加COM初始和终止代码。在应用程序类的初始化实例函数Ini...

haodawei123的博客 812

行人重识别(ReID)基础知识入门

行人重识别(Person re-identification)主要目的是针对出现在监控摄像头内的某个目标行人,准确快速地从监控网络其他摄像头内的大量行人中将这个目标行人标识出来。如图所示一个区域有多个摄像头拍摄视频序列,ReID的要求对一个摄像头下感兴趣的行人,检索到该行人在其他摄像头下出现的所有图片。

用于记录 1万+

TI 实时操作系统SYS/BIOS使用总结

1:概述: SYS/BIOS 是一个可扩展的实时的操作系统。具有非常快速的响应时间(在中断和任务切换时达到较短的延迟),响应时间的确定性,强壮的抢占系统,优化的内存分配和堆栈管理(尽量少的消耗和碎片)。能够实现系统的模块化并可裁剪。 最大的特点就是:实时。 2:XDCtools: XDCtools 是SYS/BIOS引用的一种实时的软件组件技术(RTSC),它包括一些有用的工具,标准的AP

带头奋青的博客 5万+

C++中COM组件的创建和调用

在C++中COM组件的创建和调用

qianniulaoren的博客 4388

Mit6.S081-实验1-Xv6 and Unix utilities

Mit6.S081-实验1-Xv6 and Unix utilities前言一、Boot xv61,实验目的2,操作流程1)切换到xv6-labs-2020代码库的lab1分支2)启动xv63)测试xv64)过程分析5)其他操作二、在xv6中添加一个自己编写的程序1,源码准备2,编译配置3,测试添加程序4,过程分析三、xv6中shell简析 前言 一、Boot xv6 1,实验目的 利用qemu启动xv6 2,操作流程 1)切换到xv6-labs-2020代码库的lab1分支 git checkout ut

code a better life~ 36万+

c++ 调用c#dll (2种方式,com组件和clr工程)

c++ 调用c#dll ,com组件和clr工程两种方式分别实现成功

qq_43525389的博客 9131

Autosar CAN 网络管理标准文档

Autosar CAN 网络管理标准文档

蚂蚁小兵 925

UE5 GAS 学习笔记 1.2游戏标签

这一节对GameplayTag游戏标签进行详细的讲解。

CloudHuCoding 1928

DCOM揭秘

http://www.pcdog.com/p/html/2004927/27920042820_1.htm Distributed COM --跨网络工作  DCOM代表的是“Distributed(分布式)”COM。在前面的部分中,我们已经讲解了运行在同一部计算机的COM客户和服务器。在这一部分,我们将讨论如何将它扩展到DCOM的领域和分布式计算。   大多数的COM编程者仅使用本地的“进程内”

天道酬勤 6624

解读 2025《高质量数据集 质量评测规范》

《高质量数据集质量评测规范》为2025年数据质量评估提供标准化框架,适用于政府部门、AI企业、数据服务商等行业主体。规范以"说明文档-数据质量-模型应用"三维体系为核心:明确定义高质量数据集分类,细化各项指标要求(包括文档完整性、数据规范性、应用多样性等),并提供具体评分细则(百分制,90分达标)和计算方法。附录补充多模态数据处理细则,旨在建立可操作的质量评估标准,保障优质数据供给流通。

cdfunlove的博客 1887

vc中调用Com组件的方法详解

需求: 1.创建myCom.dll,该COM只有一个组件,两个接口: IGetRes--方法Hello(), IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库 #import "组件所在目录myCom.dll" no_namespace 或 #import "类型库所在目录myCom.tlb" usingnamesp

qq1134993111的专栏 2777

深入浅出:大型语言模型(LLM)的全面解读

在当今的数字化时代,人工智能技术已经成为各行各业的核心驱动力之一。而在人工智能的领域中,大型语言模型(LLM)作为一种引人瞩目的技术,正在以其强大的语言理解和生成能力引领着一场革命。本文旨在深入浅出地解读大型语言模型,探讨其背后的原理、技术突破、应用场景以及未来发展趋势。

fudaihb的博客 10万+

91、Windows网络配置:动态更新与名称解析全攻略

本文全面解析了Windows XP Professional系统中的网络配置方法,重点介绍了动态更新和名称解析两大核心功能。动态更新部分涵盖DHCP客户端、静态配置客户端、远程访问客户端和多宿主客户端的配置方法,并提供禁用动态更新和编辑Hosts文件的注意事项。名称解析部分详细讲解了NetBIOS名称解析的基础知识、WINS配置方法、B节点广播与Lmhosts文件的使用,以及WINS代理的作用和配置要点。通过操作建议流程图和关键操作步骤回顾,帮助用户快速掌握网络配置的核心技巧,适用于不同网络环境的实际需求。

blue42的博客 234

用C语言编程实现接口COM组件,把《C语言接口与实现》读薄之第一章:引言

1.1文学程序文学程序(literate program):接口及其实现的代码与对其进行解释的正文交织在一起。文学程序由英文正文和带标签的程序代码块组成。例如,1 〈compute x * y〉≡2 sum = 0;3 for (i = 0; i < n; i++)4 sum += x[i]*y[i];定义了名为〈compute...

weixin_39996750的博客 679

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怎样在VC++下调试COM对象

怎样在VC++下调试COM对象 调试进程外服务(Debugging Out-Of-Process Server)  因为服务的方法和事件的实现要靠客户来触发,所以调试服务必须要先启动客户程序。方法一:     1. 在Project àSetting的Debug Tab上输入客户程序;     2. 在服务程序代码中设置断点既可调式。方法二:(在客户工程中启动调试任务)

阿波的专栏 2665

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

浅谈C++调用COM组件

在调用COM组件时,需要检查每一步是否成功,并适当处理错误。:如果COM组件是你自己开发的,确保它已经被注册到系统中。:在调用任何COM组件之前,需要初始化COM库。:为了简化资源管理,可以使用智能指针,如。:确保你的项目链接了必要的COM库,如。:通过组件的CLSID来获取接口。:通过获取到的接口指针调用方法。:在程序结束前,清理COM库。:使用完接口后,需要释放。

a876106354的博客 996

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

刀与剑-C++ COM组件调用

com使用,comdll,com注册,com调用,com c++,com组件,com新手,c++ com

qq_31314583的博客 6331

COM组件三个最基本的接口类 //VC6中使用COM库的三种方法

COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch。   COM规范规定任何组件、任何接口都必须从IUnknown继承,IUnknown包含三个函数,分别是 QueryInterface、AddRef、Release。这三个函数是无比重要的,而且它们的排列顺序也是不可改变的。QueryInterface用于查询组件实现的其它接口,说白了也就是看看

zhoubl668的专栏:远帆,梦之帆! 4980

VC6.0和VS2005:C++和C#编写调用COM组件

这篇文章就是关于COM组件的编写和调用的,主要包含了使用VC6.0编写和调用COM组件,VS2005中使用C#编写和调用COM组件,以及在VC6.0和VS2005之间互相调用COM组件。 <br /> <br />前一阵在工作中做项目的时候,遇到了COM组件的调用和使用问题,当时研究和好一阵,才把中间的环节打通,现在写出来为大家提供方便,这里包含了四个类型:<br />1、在VS2005中,C#编写DLL并使用C++调用<br />2、在VS2005中C#编写的COM组件,使用VC6.0调用<br /

jackmacro的专栏 1187

C#调用COM接口的三种方式

C# 调用COM接口 获取HRESULT而不是抛出异常

sinat_35549832的博客 1万+

通过C++调用Com接口

难忘当时暮朝朝, 风又飘来雨潇潇

钞sir的博客 1万+

vc中调用Com组件的五种方法详解

vc中调用Com组件的方法详解 转载自:http://www.cppblog.com/woaidongmao/archive/2011/01/10/138250.html 需求: 1.创建myCom.dll,该COM只有一个组件,两个接口:    IGetRes--方法Hello(),    IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库

blacet的专栏 1万+

vc中调用Com组件的方法

需求: 1.创建myCom.dll,该COM只有一个组件,两个接口:    IGetRes--方法Hello(),    IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库 #import "组件所在目录myCom.dll" no_namespace 或 #import "类型库所在目录myCom.tlb" using namespace MYCOM;

iMaxb的专栏 770
上一篇: 非匿名方式访问远程的com+
下一篇: 用户名不同的计算机之间的调用dcom
embededvc
博客等级 码龄21年 176粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值