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   
}
相关推荐
唐青枫10 小时前
别把日志、权限写进业务方法:C#.NET 动态代理从原理到实战
c#·.net
风云10 小时前
Vane.Dispatch 1.0.0 发布:一个与容器、传输层零耦合的 .NET 服务分发引擎
微服务·mvc·.net·ndf·vane.dispatch
张人玉20 小时前
基于 C# WinForms + .NET 8 + SQLite + TCP Socket 的多连接通讯调试工具——TCP通讯助手(TcpAssistant)
tcp/ip·sqlite·c#·.net
mldong1 天前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
风云1 天前
MiniLog 1.0 GA 发布:零分配、零依赖的 .NET 高性能日志框架
开源·c#·.net·日志·高性能·minilog
慧都小妮子1 天前
C# 工程图纸数字化入库实战:Aspose.Imaging 自动抠图、多页 TIFF 合卷与坏页容错
图像处理·c#·.net·aspose·tiff·归档·文档管理
A_nanda2 天前
C# 调用 .NET(Core)Web 服务混用:常见问题与 .NET 6~10 正确写法
c#·.net
rockey6272 天前
C#脚本引擎之AScript与Z.Expressions.Eval对比
c#·.net·script·expression·动态脚本
geovindu3 天前
CSharp: Wordcloud
开发语言·后端·c#·.net·.netcore·词云
geovindu3 天前
CSharp: Command Pattern
开发语言·后端·c#·.net·.netcore·命令模式·行为模式