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   
}
相关推荐
C++ 老炮儿的技术栈16 分钟前
Ubuntu root账号自动登陆
linux·运维·服务器·c语言·c++·ubuntu·visual studio
A.零点4 小时前
【2个月 C 语言从入门到精通:零基础系统教程】第十二讲:深入了解指针(五)
c语言·开发语言·网络·笔记·visual studio
彷徨而立5 小时前
【VS2026】介绍 Visual Studio 几个重要配置项
visual studio
tonydf8 小时前
DotNet项目接入Copilot SDK简单案例
后端·.net·github copilot
ABprogramming8 小时前
Aspire入门指南
c#·.net
User_芊芊君子8 小时前
鸿蒙PC适配:Pinta GTK 图像编辑器鸿蒙 PC ArkWeb 适配全记录:从 .NET_GTK4 桌面到 HarmonyOS PC HAP
编辑器·.net·harmonyos
AndyHuang19768 小时前
【避坑指南】Visual Studio 插件报错 “Windows Terminal (wt.exe) was not found in PATH“ 完美解决
ide·windows·visual studio
彷徨而立9 小时前
【Visual Studio】msbuild 使用举例
ide·visual studio
ServBay1 天前
你跟高级 C# 工程师的区别,就是这8个开发技巧
后端·c#·.net
blueman88881 天前
VS2022 切换定义(F12 / Go to Definition)反应慢
c++·visual studio