ATL工程调用 MFC dll导出函数的问题

gccflag 2009-07-03 05:32:56
现有历史遗留的 MFC dll,有一个导出函数接口。

编写一个ATL 简单对象组件(也是动态库),调用这个MFC dll的接口,能够调用成功。

但是 其它语言 如VB和 网页中调用就不能成功。同时怎么样把这个ATL组件做成多线程的?
...全文
161 9 打赏 收藏 转发到动态 举报
写回复
用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等就可以调用了

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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