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   
}
相关推荐
发霉的闲鱼5 小时前
MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击
c++·mfc
小c君tt5 小时前
MFC中Excel的导入以及使用步骤
c++·excel·mfc
羊小猪~~8 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
WineMonk8 小时前
.NET WPF CommunityToolkit.Mvvm框架
.net·wpf·mvvm
界面开发小八哥8 小时前
界面控件DevExpress WPF中文教程:Data Grid——卡片视图设置
.net·wpf·界面控件·devexpress·ui开发
九鼎科技-Leo19 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
躺不平的理查德20 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
九鼎科技-Leo21 小时前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发21 小时前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf