Visual Studio 2022 MFC 调用Com Dll(VS2010通过VB.NET生成的DLL)
背景
简单介绍一下背景把,这样如果我所遇到的实际情况跟你所面临的处境有些许相似的话或许可以帮助到你!
- 通过Excel VBA开发了一款工具,当然是通过VBA的类模块
- VB跟VBA在语言上是有一定的相通的
- 为了某种目的需要将VBA的代码封装(Excel的工程密码就是个笑话哈)
- VBA代码封装首先想到的是VB6.0,但是呢这个工具可能不太会用,毕竟从我接触代码开始基本都是VisualStudio
- 所以VBA的代码被我通过VisualStudio VB Dll(VB.NET)工程封装成了dll
- 再后来就是发现这个dll跟我平时C++写出来的还不一样,普通dll和Com dll
- 再后来就是通过VB Form窗体加载Reference 将VB Dll直接调用(方便很多)
- 后来出于某种目的,想在MFC上调用VB.NET生成的这个Com Dll,发现教程确实不是很多, 也就这篇文章还可以
- 总结就是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.tlh
和ComDltMushroomer.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
}