在DLL里面调用COM组件的接口函数出错

vista1975 2011-06-22 09:43:45
本人开发工具是VS2010,操作系统是WINDOWS7 64位,C# 开发。

调用COM组件的方法是直接在 Add Reference 对话框中选择COM选项卡,选择其中的COM服务。

如果在生成的一个应用程序(EXE)中直接添加,没问题,一切正常。

但我需要在一个DLL中调用COM,然后外部EXE程序再调用我的DLL,这个时候就会出现COM的某些函数无法调用,就会出现类似“Error HRESULT E_FAIL has been returned from a call to a COM component.”的错误。

困扰2天了,求解!
...全文
399 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
vista1975 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mjp1234airen4385 的回复:]

在Dll中调用com组件,一般要加入组件初始化的调用。
你找到初始化comm组件的api函数,导入到你的dll工程中。
在dll中使用com组件之前,调用初始化函数。
CoInitialize
[/Quote]

老兄,我根本就找不到CoInitialize,能否贴出一点代码?谢谢
mjp1234airen4385 2011-06-22
  • 打赏
  • 举报
回复
在Dll中调用com组件,一般要加入组件初始化的调用。
你找到初始化comm组件的api函数,导入到你的dll工程中。
在dll中使用com组件之前,调用初始化函数。
CoInitialize
vista1975 2011-06-22
  • 打赏
  • 举报
回复
在DLL中调用COM后,调用DLL的外部EXE就不需要再直接调用COM了,功能都在DLL中实现了嘛。

我想我已经表述清楚了吧。
vista1975 2011-06-22
  • 打赏
  • 举报
回复
在DLL中调用COM后,调用DLL的外部EXE就不需要再直接调用COM了,功能都在DLL中实现了嘛。

我想我已经表述清楚了吧。
vista1975 2011-06-22
  • 打赏
  • 举报
回复
如果在exe程序中调用com就没有任何问题,如果是在dll中调用就出错。
龍月 2011-06-22
  • 打赏
  • 举报
回复
外部EXE程序 是什么程序?
有没有代码?
感觉 外部这个程序是不是也要引用 com
LIMINLY520 2011-06-22
  • 打赏
  • 举报
回复
学习中……
vista1975 2011-06-22
  • 打赏
  • 举报
回复
顶上去,求解!
vista1975 2011-06-22
  • 打赏
  • 举报
回复
注意,我的DLL是运行在windows服务进程之中。

如果不在windows服务中运行的话,是可以通过DLL调用COM组件的。

呵呵。

vista1975 2011-06-22
  • 打赏
  • 举报
回复
System.Runtime.InteropServices.COMException was caught
Message=Exception from HRESULT: 0xC0040007
Source=GWOPC.NET
ErrorCode=-1073479673
vista1975 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 loveyan52152112 的回复:]

那就在EXE所在的DLL引用COM组建呗,后台调用时通过委托来实现不就行了!
[/Quote]

DLL都是不行的。
slg2003 2011-06-22
  • 打赏
  • 举报
回复
学习~~~`
白鸽 2011-06-22
  • 打赏
  • 举报
回复
那就在EXE所在的DLL引用COM组建呗,后台调用时通过委托来实现不就行了!
vista1975 2011-06-22
  • 打赏
  • 举报
回复
还是迷茫中。。。
因文件超过20M不能上传,所以拆分为两个文件分次上传 第1章 COM背景知识 1.1 COM的起源 1.1.1 软件业面临的挑战 1.1.2 传统解决方案 1.1.3 面向对象程序设计方法 1.1.4 最终解决方案:组件软件 1.1.5 面向对象的组件模型——COM 1.2 COM的发展历程 1.2.1 COM以前的对象技术:DDE、OLE 1、VBX控件 1.2.2 COM首次亮相:OLE2 1.2.3 Microsoft拥抱Internet:ActiveX 1.2.4 更多的新名词:Windows DNA和COM+ 1.2.5 远程对象:ORBs和DCOM 1.2.6 COM的最新版本:COM+ 1.3 COM技术现状 1.3.1 COM与CORBA 1.3.2 COM与Enterprise Java Beans 1.3.3 Windows之外的COM 小结 第2章 从C++到COM 2.1 C++客户重用C++对象——例程DB 2.1.1 C++对象 2.1.2 客户程序 2.2 将C++对象移进DLL中——例程DB_cppdll 2.2.1 成员函数的引出 2.2.2 内存分配 2.2.3 Unicode/ASCII兼容 2.2.4 例程实现 2.2.4.1 修改接口文件 2.2.4.2 修改对象程序 2.2.4.3 修改客户程序 2.3 C++对象使用抽象基类——例程DB_vtbl 2.3.1 问题:私有数据成员被暴露 2.3.2 解决方案:抽象基类 2.3.2.1 什么是抽象基类(Abstract Base Class) 2.3.2.2 实现秘诀:虚函数(Virtual Functions) 2.3.3 使用抽象基类 2.3.4 例程实现 2.3.4.1 修改接口文件 2.3.4.2 修改对象程序 2.3.4.3 修改客户程序 2.4 改由COM库装载C++对象——例程dbalmostcom 2.4.1 COM库 2.4.2 对象创建的标准入口点 2.4.3 标准对象创建API 2.4.4 标准对象注册 2.4.5 例程实现 2.4.5.1 修改接口文件 2.4.5.2 修改对象程序 2.4.5.3 修改客户程序 2.5 将C++对象变成COM对象 2.5.1 引用计数 2.5.2 多接口 2.5.3 IUnknown接口 2.5.4 标准类厂接口:IClassFactory 2.5.5 对象代码的动态卸载 2.5.6 自动注册 2.5.7 例程实现 2.5.7.1 修改接口文件 2.5.7.2 修改对象程序 2.5.7.3 修改客户程序 2.6 为COM对象添加多接口支持 2.6.1 多接口 2.6.2 DEFINE_GUID 2.6.3 例程实现 2.6.3.1 修改接口文件 2.6.3.2 修改对象程序 2.6.3.3 修改客户程序 小结 第3章 COM基础知识 3.1 对象与接口 3.1.1 COM对象 3.1.2 COM接口 3.1.3 IUnknown接口 3.1.3.1 生存期控制:AddRef和Release 3.1.3.2 接口查询:QueryInterface 3.1.4 全球唯一标识符GUID 3.1.5 COM接口定义 3.1.6 接口描述语言IDL 3.2 COM应用模型 3.2.1 客户/服务器模型 3.2.2 进程内组件 3.2.3 进程外组件 3.2.4 COM库 3.2.5 HRESULT返回值 3.2.6 COM与注册表 3.3 COM组件 3.3.1 实现类厂对象 3.3.2 类厂对象的创建 3.3.3 实现自动注册 3.3.4 实现自动卸载 3.4 COM客户 3.4.1 COM对象创建函数 3.4.1.1 CoGetClassObject 3.4.1.2 CoCreateInstance 3.4.1.3 CoCreateInstanceEx 3.4.2 如何调用进程内组件 3.4.3 COM客户调用进程外组件 3.5 进一步认识COM 3.5.1 可重用机制:包容和聚合 3.5.2 进程透明性 3.5.3 安全性机制 小结 第4章 COM扩展技术 4.1 可连接对象机制 4.1.1 客户、接收器与可连接对象 4.1.1.1 接收器 4.1.1.2 可连接对象 4.1.1.3 客户 4.1.2 实现可连接对象 4.1.3 实现接收器 4.1.4 建立接收器与连接点的连接 4.1.5 获得出接口的类型信息 4.2 结构化存储 4.2.1 什么叫结构化存储和复合文件 4.2.2 存储对象和IStorage接口 4.2.2.1 IStorage接口 4.2.2.2 获得IStorage指针 4.2.2.3 释放STATSTG内存 4.2.2.4 枚举存储对象中的元

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧