VC 调用 VB 的DLL

VC++/MFC 专栏收录该内容
94 篇文章 0 订阅

在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
    点赞
  • 1
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

rundll64

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值