社区
ATL
帖子详情
ATL工程调用 MFC dll导出函数的问题
gccflag
2009-07-03 05:32:56
现有历史遗留的 MFC dll,有一个导出函数接口。
编写一个ATL 简单对象组件(也是动态库),调用这个MFC dll的接口,能够调用成功。
但是 其它语言 如VB和 网页中调用就不能成功。同时怎么样把这个ATL组件做成多线程的?
...全文
161
9
打赏
收藏
ATL工程调用 MFC dll导出函数的问题
现有历史遗留的 MFC dll,有一个导出函数接口。 编写一个ATL 简单对象组件(也是动态库),调用这个MFC dll的接口,能够调用成功。 但是 其它语言 如VB和 网页中调用就不能成功。同时怎么样把这个ATL组件做成多线程的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gccflag
2009-07-03
打赏
举报
回复
这个被ATL封装的MFC dll 的导出函数使用了前面一位说的 AFX_MANAGE_STATE(AfxGetStaticModuleState());
本身又调用了其它一些常规MFC dll。
这些常规dll里面含有很多全局变量。有没有办法把调用ATL组件的客户做成多线程的?可以使用套间实现这个多线程吗?
gccflag
2009-07-03
打赏
举报
回复
用VB调用时能够创建对象,但调用接口时提示AccessInvalid内存错误。
我前两个参数传入的是String型,后面那个用的是Long型(听说VB的Long是32位的)。VB代码如下:
Dim sz1 As String
sz1 = "1000.00"
Dim sz2 As String
sz2 = "0755005"
Dim iRes As Long
iRes = -1
Set obj = CreateObject("ClassA.Method1") 'ProgID
obj.IdentifyBill sz1, sz2, iRes
Set obj = Nothing
fengrx
2009-07-03
打赏
举报
回复
如果对话框上又调用了OCX等于组件了,需要加入三句:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CoInitialize(NULL);
AfxEnableControlContainer();
fengrx
2009-07-03
打赏
举报
回复
mfc导出的DLL如果有对话框等资源,在函数前面要加:AFX_MANAGE_STATE(AfxGetStaticModuleState());
fengrx
2009-07-03
打赏
举报
回复
接口定义没有问题。
楼主调用不成功是什么现象呢?
gccflag
2009-07-03
打赏
举报
回复
这是添加的接口
STDMETHODIMP CClassA::Method1(BSTR sz1, BSTR sz2, int *iResult)
这个接口内部调用一个MFC dll导出的函数。这个函数接收前两个参数然后弹出对话框。对话框结束后返回值给输出参数
这是接口的定义
[id(1), helpstring("method Method1")] HRESULT Method1([in] BSTR sz1,[in] BSTR sz2, [out] int* iResult)
fengrx
2009-07-03
打赏
举报
回复
[Quote=引用 2 楼 gccflag 的回复:]
现在是用的ATL封装成了简单组件,在ATL的内部调用的MFC dll。
用VC可以调用这个组件的接口,但是用VB调不了
[/Quote]
楼主需要确认是ATL提供的接口问题,还是接口没问题,而是在ATL内部运行调用DLL部分出错。
可能出错的地方:ATL的接口参数类型问题。
楼主把代码帖下吧。
gccflag
2009-07-03
打赏
举报
回复
现在是用的ATL封装成了简单组件,在ATL的内部调用的MFC dll。
用VC可以调用这个组件的接口,但是用VB调不了
oyljerry
2009-07-03
打赏
举报
回复
可以用ATL封装成ActiveX,内部调MFC dll,这样网页,VB等就可以调用了
ATL
封装
MFC
对话框
创建
ATL
工程
,将
MFC
对话框封装进
ATL
中,并在实例程序中
调用
此对话框,相比
MFC
的
DLL
,减少了好多操作。不用手动切换主程序和
Dll
的状态,非常方便。
VS2012创建
ATL
工程
及使用
MFC
测试COM组件
这篇文章首先介绍了如何创建一个
ATL
工程
,并为其添加接口类和实现接口方法;然后介绍了如何利用自动化的方式
调用
由
ATL
生成的
dll
,即在程序中获取CLSID和IID然后创建接口实例;最后分析了在程序中CLSID和IID获取时候的索引,由于.idl文件中库声明中接口类的声明顺序不一样,就导致了获取类型信息时候的索引不一样,这在自动化COM组件的使用中需要注意。
《在ActiveX控件中如何动态
调用
DLL
函数
》配套代码VC源代码
本代码演示了如何再ActiveX中动态
调用
DLL
函数
。 关键字:activex,
atl
,
dll
,pos机
DLL
+ ActiveX控件+WEB页面
调用
例子
一、 概述 因项目需要,开始学习并研究VC、
DLL
及ActiveX控件,网上资料找了很多,但没一个可用的或者说没一个例子可理解并运行的。没办法,自己研究吧。功夫不负有心人,终有小成了,呵呵,现在把自己学习总结了一下,献给需要的人。
DLL
(动态链接库): 分WIN32
DLL
和
MFC
DLL
ActiveX:分
ATL
控件和
MFC
控件两类(也是一个
DLL
) WEB:JAVASCRIPT
调用
-> ActiveX
调用
->
DLL
完成加法运算并返回值,在页面上显示。 二、开发(VS2008) 1、
DLL
库编写: 文件-》新建-》WIN32控制台->填写项目名称-》选择
DLL
-》空项目-》完成。
用VS2010生成OCX控件.zip
新建项目,选择
MFC
DLL
这里随便选,我选择共享
MFC
DLL
添加类 添加一个
ATL
简单对象 下一步,下一步,完成 实现接口:IObjectSafetyImpl public IObjectSafetyImpl 添加映射 类视图 IReader 添加方法 向导自动生成接口代码 在接口实现代码中加入一个 MessageBox 编译
工程
Ocx 代码就写完了,接下来写测试程序: 新建一个 WinForm 添加引用 编写测试代码 测试运行 下面我们来尝试通过网页
调用
OCX 查看注册表文件 Reader.rgs IE 浏览器打开任意网址,F12 呼出调试工具,切换到脚本,控制台窗口 控制台执行:var a = new ActiveXObject("Reader"); 控制台执行:a.CallFun('1234'); 网页中插入以下脚本并测试:
ATL
3,245
社区成员
48,539
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章