VC 调用 VB 的DLL

来源:互联网 发布:sql join where 区别 编辑:程序博客网 时间:2024/04/28 01:39

在stdafx.h文件中

#import "VB_ADO_DBConnect.dll"using namespace VB_ADO_DBConnect;

先编译一下,会得到2个文件,分别是“vb_ado_dbconnect.tlh”与“vb_ado_dbconnect.tli”

其中".til"文件是调用的方法,".tlh"文件是函数的定义,这里我们可以视它为.h文件


HRESULT hresult;CLSID clsid;CoInitialize(NULL);hresult=CLSIDFromProgID(OLESTR("VB_ADO_DBConnect.Rijndael"), &clsid);_Rijndael *t;hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_Rijndael),(LPVOID *) &t);if(FAILED(hresult))        return ;

在调用vb的dll之前,需要先声明几个变量

HRESULT hresult;CLSID clsid;CoInitialize(NULL); 这个是很主要的,因为vb的dll是Activex,要以com形式加载,所以这句必不可少

hresult=CLSIDFromProgID(OLESTR("VB_ADO_DBConnect.Rijndael"), &clsid);
这里的"VB_ADO_DBConnect.Rijndael",其中“VB_ADO_DBConnect”,是在.tlh文件中声明的,也就是DLL的命名空间,格式如下“namespace VB_ADO_DBConnect {……”

而“Rijndael”是在.tlh中的结构变量 默认格式是“struct /* coclass */ Rijndael;”

接着用_Rijndael *t;直接声明一个指针

hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_Rijndael),(LPVOID *) &t);
这里的"__uuidof(_Rijndael)"

是vb的DLL中_COM的定义

_COM_SMARTPTR_TYPEDEF(_Rijndael, __uuidof(_Rijndael));

接着我们就可以判断这个指针是否为空了,如果不为空,则加载成功,否则返回

这里还需要注意一点的就是在调用vb的dll时,需要先用regsvr32 xxx.dll进行注册,卸载xxx.dll方法则是regsvr32 /u xxx.dll


当上面都没有错误了,下面就可以通过指针直接调用vb里的函数了


下面是完整的代码


        HRESULT hresult;CLSID clsid;CoInitialize(NULL);hresult=CLSIDFromProgID(OLESTR("VB_ADO_DBConnect.Rijndael"), &clsid);_Rijndael *t;hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_Rijndael),(LPVOID *) &t);if(FAILED(hresult))return ;/*int iSize;int *size = &iSize;*size = Key128;t->setKeySize((KSize*)size);*/ 注视掉的部分是调用这个dll中的一个enum类型的枚举        KSize* psize = new KSize;*psize = Key128;t->setKeySize(psize);delete psize;BSTR b_key,b_input;CString strkey,strinput;strkey = L"test";strinput = L"我要加密";b_key= strkey.AllocSysString();b_input = strinput.AllocSysString();_bstr_t b_run;b_run = t->GetEncrypt(&b_input,&b_key);//这里是调用加密方法CString str;str.Format(L"%s",(LPCTSTR)b_run);AfxMessageBox(str);b_input = str.AllocSysString();b_run = t->GetDecryp(&b_input,&b_key);//这里调用解密方法str.Format(L"%s",(LPCTSTR)b_run);AfxMessageBox(str);t->Release(); //这里开始释放SysFreeString(b_input);//这里开始释放SysFreeString(b_key);//这里开始释放CoUninitialize(); 释放掉com





0 0