简单介绍一下背景把,这样如果我所遇到的实际情况跟你所面临的处境有些许相似的话或许可以帮助到你!
如果你通过VB语言编译生成过Com类的dll文件,那么你一定不会陌生的是他会生成好多个文件,常见的有:
Release
├── ComDltMushroomer.dll
├── ComDltMushroomer.pdb
├── ComDltMushroomer.tlb
├── ComDltMushroomer.xml
比较常用的:.tlb
?.dll
?文件
假如说上面的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
}