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   
}
相关推荐
编程乐趣12 小时前
Bogus:.NET的假数据生成利器
.net
勇者神龟18 小时前
.net framework wpf 打包免安装exe文件
.net·wpf
小码编匠1 天前
C# 实现多线程启动停止暂停继续
后端·c#·.net
持续更新中~1 天前
Visual Studio 2022 && opencv 环境配置
ide·visual studio
初学者丶一起加油1 天前
C语言基础:指针(数组指针与指针数组)
linux·c语言·开发语言·数据结构·c++·算法·visual studio
장숙혜1 天前
Visual Studio光标变为方块状换回方法
ide·visual studio
小王爱吃月亮糖1 天前
QT-QVariant类应用
开发语言·c++·笔记·qt·visual studio
追逐时光者2 天前
.NET 在 Visual Studio 中的高效编程技巧集
后端·.net·visual studio
geovindu2 天前
CSharp: Oracle Stored Procedure query table
数据库·oracle·c#·.net
三天不学习2 天前
【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列
数据库·.net·orm·微软技术·sqlsugar