MFC 调用.NET类库Com Dll,Activex Dll

Visual Studio 2022 MFC 调用Com Dll(VS2010通过VB.NET生成的DLL)

背景

简单介绍一下背景把,这样如果我所遇到的实际情况跟你所面临的处境有些许相似的话或许可以帮助到你!

  1. 通过Excel VBA开发了一款工具,当然是通过VBA的类模块
  2. VB跟VBA在语言上是有一定的相通的
  3. 为了某种目的需要将VBA的代码封装(Excel的工程密码就是个笑话哈)
  4. VBA代码封装首先想到的是VB6.0,但是呢这个工具可能不太会用,毕竟从我接触代码开始基本都是VisualStudio
  5. 所以VBA的代码被我通过VisualStudio VB Dll(VB.NET)工程封装成了dll
  6. 再后来就是发现这个dll跟我平时C++写出来的还不一样,普通dll和Com dll
  7. 再后来就是通过VB Form窗体加载Reference 将VB Dll直接调用(方便很多)
  8. 后来出于某种目的,想在MFC上调用VB.NET生成的这个Com Dll,发现教程确实不是很多, 也就这篇文章还可以
  9. 总结就是MFC调用VB.NET生成的Com Dll文件(即C++语言调用VB语言写出的dll)

Com Dll (VB.NET)

如果你通过VB语言编译生成过Com类的dll文件,那么你一定不会陌生的是他会生成好多个文件,常见的有:

复制代码
Release
 ├── ComDltMushroomer.dll
 ├── ComDltMushroomer.pdb
 ├── ComDltMushroomer.tlb
 ├── ComDltMushroomer.xml

比较常用的:.tlb .dll 文件

MFC Dialog 代码实现

假如说上面的dll.tlb文件都有了,那么剩下的就交给MFC的代码部分了

其中#import "..\BLTools\ComDltMushroomer.tlb" 是必须放在这段注释#endif中间的,反正就这么用就完事了

复制代码
//stdafx.h
#pragma once

#if 1
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#import "..\BLTools\ComDltMushroomer.tlb"	no_namespace  //..\BLTools是客户端的相对路径
//using namespace xxxx
#endif

然后编译stdafx.cpp后会生成一个ComDltMushroomer.tlhComDltMushroomer.tli文件

调用
复制代码
void CMushroomer::OnClickedTnhBtnRun()
{
	// TODO: Add your control notification handler code here
	HRESULT hresult;
	CLSID clsid;

	//CoInitialize(NULL);如果直接使用编译器会报6003警告,也就是忽略返回值警告。
	hresult = CoInitialize(NULL);	//initialize COM library
	/*if (S_OK != hresult)
	{
		AfxMessageBox(_T("Initialize Com Dll Failed"));
		return;
	}*/
	//ComDltMushroomer.CMrTH    Dll名称: ComDltMushroomer  Dll封装类:CMrTH    ,根据自己的需求更改
	hresult = CLSIDFromProgID(OLESTR("ComDltMushroomer.CMrTH"), &clsid);    //retrieve CLSID of component
	//_CMrTH 类 ,根据个人需求更改为自己的类
	_CMrTH *t;
	hresult = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, __uuidof(_CMrTH), (LPVOID*)&t);
	if (FAILED(hresult))
	{
		//宽字符导致的错误,以下两种写法均正确
		//AfxMessageBox("Creation Failed");
		AfxMessageBox(_T("Creation Failed"));
		return;
	}
	//类内方法调用,MainInput,ReadIniFile,MainOutput均为dll内的函数接口,传参根据具体情况而定
	t->MainInput((_bstr_t)iPathDcm);  //call methodkan 
	t->ReadIniFile("..//BLTools//th.ini");
	t->MainOutput((_bstr_t)oPathFolder,3);   //call method
	
	CoUninitialize();  //Unintialize the COM library   
}
相关推荐
西哥写代码1 小时前
基于dcmtk的dicom工具 第四章 图像接受StoreSCP(2)
mfc·dicom·dcmtk·vs2017
rainbow_lucky01069 小时前
MFC UI控件CheckBox从专家到小白
mfc·checkbox
斯是 陋室10 小时前
在CentOS7.9服务器上安装.NET 8.0 SDK
运维·服务器·开发语言·c++·c#·云计算·.net
张人玉11 小时前
Visual Studio 的常用快捷键
ide·visual studio
R-G-B17 小时前
【27】MFC入门到精通——MFC 修改用户界面登录IP IP Address Control
tcp/ip·ui·mfc·mfc 用户界面登录·mfc ip登录·mfc address登录
程序视点17 小时前
Microsoft .Net 运行库离线合集包专业解析
前端·后端·.net
深盾安全19 小时前
.NET性能优化秘籍:这些实战技巧让你的代码性能大幅提升
.net
追逐时光者20 小时前
.NET 使用 DocNET 库快速高效的操作 PDF 文档
后端·.net
我是唐青枫20 小时前
C#.NET 泛型详解
开发语言·c#·.net
R-G-B21 小时前
【46】MFC入门到精通——MFC显示实时时间,获取系统当前时间GetCurrentTime()、获取本地时间GetLocalTime()
c++·mfc·mfc显示实时时间·mfc获取系统当前时间·getcurrenttime·getlocaltime