VC实现一个库,并用VB(Visual Basic)来调用的方法,包括传递数组的方法
2016-12-05 11:59
423 查看
因为工作需要,最近写了一个VB小软件,很多功能已经用VC写好了,如果再用VB整一遍太麻烦。最好的方法将VC程序编译成dll库,然后用VB来调用就行了。虽然VB已经很老了,但是做一些小软件还是非常方便的,下面就来介绍如何将VC程序实现的crc校验程序编译成dll库,接下来介绍如何使用VB来来用,使用时注意参数要对应,特别是特别是数组传递要对应起来。
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
之后单击“构建(build)”按钮,或者直接按键盘的F7键,则在工程目录下生成crc16_ccitt.dll和crc16_ccitt.lib文件。
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!
第一步:使用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!
相关文章推荐
- JS:调用方法实现向数组中追加一个元素
- 一个内核模块例子(实现调用其他模块中的方法,传递参数等)
- vb.net调用vc动态库时传递数组参数应注意的问题
- 请赐教:用C++做一个DLL在VB中调用,要传递的是一个数组
- 一个用JSP实现的分页的类及调用方法
- vc调用vb DLL方法
- 关于使用vc++调用matlab生成的dll传递数组的问题
- 一个用JSP实现的分页的类及调用方法
- VB.net 在一个From 关闭后切换到另一From 实现方法,并加载XP视觉样式
- 一个用JSP实现的分页的类及调用方法
- 在VC++中实现让程序只运行一个实例的方法
- 一个用JSP实现的分页的类及调用方法
- 一个用JSP实现的分页的类及调用方法
- vb般的VC++开发(4)--调用IDispatch接口的属性和方法
- vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法
- 一个用JSP实现的分页的类及调用方法
- VB.NET中实现控件数组的方法
- 一个在VC中调用web service的方法
- 一个用JSP实现的分页的类及调用方法
- 这是一个关于XML文档的操作管理器XMLHelper类,类中包括XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现