济南网站建设服务,十大设计创意产品网站,制作app连接网站,wordpress淘宝客商城Visual Studio 2022 MFC 调用Com Dll#xff08;VS2010通过VB.NET生成的DLL#xff09;
背景
简单介绍一下背景把#xff0c;这样如果我所遇到的实际情况跟你所面临的处境有些许相似的话或许可以帮助到你#xff01;
通过Excel VBA开发了一款工具#xff0c;当然是通过…Visual Studio 2022 MFC 调用Com DllVS2010通过VB.NET生成的DLL
背景
简单介绍一下背景把这样如果我所遇到的实际情况跟你所面临的处境有些许相似的话或许可以帮助到你
通过Excel VBA开发了一款工具当然是通过VBA的类模块VB跟VBA在语言上是有一定的相通的为了某种目的需要将VBA的代码封装Excel的工程密码就是个笑话哈VBA代码封装首先想到的是VB6.0但是呢这个工具可能不太会用毕竟从我接触代码开始基本都是VisualStudio所以VBA的代码被我通过VisualStudio VB DllVB.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 hereHRESULT 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;}//类内方法调用MainInputReadIniFileMainOutput均为dll内的函数接口传参根据具体情况而定t-MainInput((_bstr_t)iPathDcm); //call methodkan t-ReadIniFile(..//BLTools//th.ini);t-MainOutput((_bstr_t)oPathFolder,3); //call methodCoUninitialize(); //Unintialize the COM library
}