您的位置:首页 > 编程语言 > VB

VC实现一个库,并用VB(Visual Basic)来调用的方法,包括传递数组的方法

2016-12-05 11:59 423 查看
因为工作需要,最近写了一个VB小软件,很多功能已经用VC写好了,如果再用VB整一遍太麻烦。最好的方法将VC程序编译成dll库,然后用VB来调用就行了。虽然VB已经很老了,但是做一些小软件还是非常方便的,下面就来介绍如何将VC程序实现的crc校验程序编译成dll库,接下来介绍如何使用VB来来用,使用时注意参数要对应,特别是特别是数组传递要对应起来。

第一步:使用VC编译dll库

   1.启动VC6.0,依次操作“”文件—>新建—>工程—>Win32 Dynamic-Link Library",工程名称为crc16_ccitt,位置自己确定,点击确定,后选择一个空白文档。

  2。新建三个文件crc16_ccitt,cpp、crc16_ccitt.h和crc16_ccitt.def。前两个可以通过VC的sourcefile和headfile自动添加文件后缀,而crc16_ccitt.def文件建立的时候选择新建文本文件,然后将后缀写成.edf就行了。

crc16_ccitt.h的内容为:

extern "C" _declspec(dllexport) int _stdcall cal_crc( int *ptr, char len);
上面只声明了一个函数cal_crc。如果有多个函数,就为每个函数加一条类似上面的语句。

crc16_ccitt,cpp文件的内容为如下所示,这是一个完整的CPP程序,除了没有main函数入口。
#include "stdio.h"
#include <stdlib.h>
#include<string.h>
#include "crc16_ccitt.h"

unsigned short int _stdcall crc16_ccitt(unsigned short int *ptr, int len)
{
unsigned char i;
unsigned short int crc=0xFFFF;
unsigned short int *crcptr;

crcptr=(unsigned short int*)malloc(sizeof(unsigned short int)*len);

for(i=0;i<len;i++)
crcptr[i]=ptr[i];

FILE *fp;
fp=fopen("log.log", "w"); //建立一个文字文件只写

fprintf(fp, "date for wirte:\n "); /*向所建文件写标题*/

for(i=0;i<len;i++)
fprintf(fp, "%x ", crcptr[i]); /*向所建文件写一整型数*/

while(len--!=0)
{
for(i=0x80;i!=0;i/=2)
{
if((crc&0x8000)!=0)
{
crc*=2;
crc^=0x1021;
}else
crc*=2;
if((*crcptr&i)!=0)
crc^=0x1021;
}
crcptr++;
}
fclose(fp);
return (crc);
}crc16_ccitt.def文件比较特殊,是用来指定导出的函数的。我们这里的内容为: 
LIBRARY plf
EXPORTS
crc16_ccitt @1如果有多个函数,就在文件里依次添加每个函数。例如
rc16_ccitt @1
rc32_ccitt @2

之后单击“构建(build)”按钮,或者直接按键盘的F7键,则在工程目录下生成crc16_ccitt.dll和crc16_ccitt.lib文件。

第二步:使用VB调用dll库

VB中调用方法也很简单,可以在配置中添加库,也可以直接使用代码加,我喜欢直接使用代码写。将crc16_ccitt.dll文件放入到VB工程目录下,或者指定的目录下,当前目录可以写为".\crc16_ccitt.dll",然后在代码的最上端添加下面的代码:

Private Declare Function crc16_ccitt Lib ".\crc16_ccitt.dll" (ByRef c As Integer, ByVal l As Long) As Long

然后就可以写测试方法了:
Private Sub Form_Load()
Dim c(6) As Integer
Dim rcr As Long
Dim rcrl As Long
Dim rcrh As Long
c(0) = &H1
c(1) = &H2
c(2) = &H3
c(3) = &H4
c(4) = &H5
c(5) = &H6

rcr = crc16_ccitt(c(0), 6)

crch = (Fix(rcr / 256)) '十六进制编码数字 HEX()
crcl = (rcr Mod 256)

Text1.Text = Hex(crch) & ";" & Hex(crcl)

End Sub

注意这里的参数必须要对应,否则将无法正确编译。
OK!good luck!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  visual basic 软件