| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 641 人关注过本帖
标题:问个关于mingw开发dll的问题
只看楼主 加入收藏
pardream
Rank: 1
等 级:新手上路
帖 子:16
专家分:8
注 册:2010-7-9
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:7 
问个关于mingw开发dll的问题
我用mingw开发dll,但无法调用regsvr32进行注册,相同的程序,使用vc编译后就可以。
有什么办法能够把mingw开发的dll也可以用regsvr32进行注册?
搜索更多相关主题的帖子: 开发 
2013-07-15 11:29
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:7 
用 Depends.exe 看下vc开发的dll 和mingw开发的dll  到处函数有什么区别,我估计是少到处了几个函数了的。
regsvr32 注册失败也有错误信息的,看下错误信息是什么,从中找错误线索

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-07-15 12:10
pardream
Rank: 1
等 级:新手上路
帖 子:16
专家分:8
注 册:2010-7-9
收藏
得分:0 
regsvr32 注册时提示:
 xxx.dll was loaded, but the DllRegisterServer entry point was not found.
This file can not be registered.

用Dependency walker查看dll
DllRegisterServer@0
与VC编译结果差别就在@0上,可能这就是原因吧。
但不知道有没有办法搞定?

7.rar (336.49 KB)

而同样的代码,使用VC6编译后,则可正常注册。并注册后,使用mingw的调用com程序也可以正常调用。
$ w
Client:         Call CoCreateInstance to create
Client:         Component and get interface IX.
DllGetClassObject:      Create class factory.
Class factory:          Create component.
Component:              Return pointer to IX.
Class factory:          Destroy self.
Component:              Return pointer to IX.
Client:         Succeeded getting IX
Fx
Client:         Ask for interface IY.
Component:              Return pointer to IY.
Client:         Succeeded getting IY.
Fy
Client:         Release IY interface.
Client:         Ask for inter IZ.
Client:         Could not get interface IZ.
Client:         Release IX interface.
Component:              Destroy self.
CHAP07.rar (92.59 KB)

注:代码是《COM技术内幕》第七章的例程

[ 本帖最后由 pardream 于 2013-7-15 18:00 编辑 ]
2013-07-15 17:52
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
回复 3楼 pardream
but the DllRegisterServer entry point was not found.

要注册,就要要提供这个到处借口才可以的——DllRegisterServer

我猜你就是少弄几个导出借口

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-07-15 18:29
pardream
Rank: 1
等 级:新手上路
帖 子:16
专家分:8
注 册:2010-7-9
收藏
得分:0 
并不是少接口,而是因为gcc编译的结果DllRegisterServer@0
多了@0,导致regsvr32不能识别它,我在头痛这个。
2013-07-17 22:31
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:7 
回复 4楼 yuccn
extern "C"
__stdcall
等等,都试试
2013-07-18 08:37
pardream
Rank: 1
等 级:新手上路
帖 子:16
专家分:8
注 册:2010-7-9
收藏
得分:0 
感谢 rjsp,虽然未彻底解决。
mingw 使用的是 __stdcall调用方式,VC编译使用的__cdecl
我偿试使用 extern "C" HRESULT __cdecl 替代 STDAPI,确实去掉了@标记,
但仍然有2个标准函数
DllCanUnloadNow()
DllGetClassObject()不可以这样修改,它们2个在objbase.h中已经被定义死了
STDAPI DllCanUnloadNow()
STDAPI DllGet...
-------------------------
编译结果已经可以被注册,但在使用时又出现问题,不能被CoCreateInstance,可能就是DllGetClassObject()仍然有 @的影响吧。
anyway, learn more.
Thank you.
2013-07-19 08:27
pardream
Rank: 1
等 级:新手上路
帖 子:16
专家分:8
注 册:2010-7-9
收藏
得分:0 
继续:
我把/mingw/include/objbase.h中的
STDAPI DllGetClassObject(REFCLSID,REFIID,PVOID*);
STDAPI DllCanUnloadNow(void);
定义注释掉。
然后把程序中的
两个函数定义都改为
extern "C" HRESULT __cdecl ...
编译结果去除了dll中的@现象
使用regsvr32 也能够注册/删除 编译的dll,但注册后存在问题:
1.注册表中的InprocServer32 Default值为"C:\WINDOWS\system32\regsvr32.exe",而不是正常的"C:\cmpnt.dll"
2.手工修改Default值后,程序运行时出现异常。但CoCreateInstance成功,获取接口也成功。
再继续研究。
2013-07-19 08:54
快速回复:问个关于mingw开发dll的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.047098 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved