如何将一个用AFX_EXT_CLASS导出的MFC拓展DLL进行二次封装

azkabanNULL 2013-05-03 04:54:32
我手头上设备的SDK为AFX_EXT_CLASS导出的MFC拓展DLL,开发需要在DotNET平台上使用,以前的SDK如果符合COM标准可以直接引用到DotNET上,external "C"的标准DLL也在DotNET上用过,用DllImport导入,相关数据类型修改下也可以。但是这次的SDK是AFX_EXT_CLASS导出的MFC拓展DLL,只需要其中一到两个函数,我想把这个DLL二次封装到一个标准DLL中供DotNET调用,这样也屏蔽了DLL中复杂的class。

DotNET好像不能直接使用这个DLL,(也许可以将这个DLL用ATL封装成COM再到DotNET中调用,我没试过),我想知道我的想法是不是可行,请大家指教,多谢了。

DLL导出的class声明中没看到什么MFC类型,只有些windows的类型,诸如LPCTSTR,SHORT

...全文
199 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2013-05-08
  • 打赏
  • 举报
回复
MFC常规DLL用的是和语言独立的标准DLL接口的话,当然可以。但是假如接口里有C++特定的语法,比如一个STL类,那么是不行的,C#里无法创建一个STL对象来传递给DLL。
azkabanNULL 2013-05-07
  • 打赏
  • 举报
回复
引用 8 楼 jiangsheng 的回复:
需要用一个MFC常规DLL或者EXE封装一遍,换成标准的接口才能被非MFC程序使用。
MFC常规DLL也可以被C#使用吗?我封成了标准DLL
azkabanNULL 2013-05-05
  • 打赏
  • 举报
回复
感谢版主,因为封装的项目无意中使用的是unicode的字符集,导致调用原DLL时链接器将函数的入口点多加了"_w"导致链接错误无法生成,改成多字节字符集即可,上面的想法都能实现了,其他的就是注意使用 __stdcall方式。
[DllImport("XXXXDK.dll", EntryPoint = "_XXXXXXXXx@8", CallingConvention = CallingConvention.StdCall)]
蒋晟 2013-05-05
  • 打赏
  • 举报
回复
需要用一个MFC常规DLL或者EXE封装一遍,换成标准的接口才能被非MFC程序使用。
azkabanNULL 2013-05-04
  • 打赏
  • 举报
回复
引用 4 楼 oyljerry 的回复:
[quote=引用 3 楼 azkabanNULL 的回复:] [quote=引用 2 楼 oyljerry 的回复:] 用COM或者其他DLL封装一下,然后给C#调用
版主可能说详细点啊,我都摸不到头绪的。谢谢[/quote] 我想把这个DLL二次封装到一个标准DLL中供DotNET调用,这样也屏蔽了DLL中复杂的class。 --- 基本就是你这么说的[/quote] 用depends查看到的函数入口跟VS爆出的链接错误的入口地址不同,导致无法链接,报错也跟lib里的函数入口不同,晕了。只能用运行时载入才能调用函数。
azkabanNULL 2013-05-04
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
用COM或者其他DLL封装一下,然后给C#调用
版主,标准DLL里是不是不能调用MFC拓展dll里的类型进行实例化啊
oyljerry 2013-05-03
  • 打赏
  • 举报
回复
引用 3 楼 azkabanNULL 的回复:
[quote=引用 2 楼 oyljerry 的回复:] 用COM或者其他DLL封装一下,然后给C#调用
版主可能说详细点啊,我都摸不到头绪的。谢谢[/quote] 我想把这个DLL二次封装到一个标准DLL中供DotNET调用,这样也屏蔽了DLL中复杂的class。 --- 基本就是你这么说的
azkabanNULL 2013-05-03
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
用COM或者其他DLL封装一下,然后给C#调用
版主可能说详细点啊,我都摸不到头绪的。谢谢
oyljerry 2013-05-03
  • 打赏
  • 举报
回复
用COM或者其他DLL封装一下,然后给C#调用
azkabanNULL 2013-05-03
  • 打赏
  • 举报
回复
class AFX_EXT_CLASS CXXXLib
{
public:
	CXXXLib(void);
	~CXXXLib(void);
	BOOL XXX_Open(LPCTSTR pszFileName);
	BOOL XXX_Close();	;
	FLOAT XXX_GetTemperature(SHORT x, SHORT y ,int nEmiss ); 
	BOOL XXX_GetImageDimension(int &iWidth,int &iHeight);
	int XXX_GetImageWidth();
	int XXX_GetImageHeight();
	void XXX_GetDate(char * ImageDate);						
};

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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