VB(EXE)/VC(DLL)混合编程实例
来源:互联网 发布:查看linux下tomcat版本 编辑:程序博客网 时间:2024/03/29 15:31
VB(EXE)/VC(DLL)混合编程实例
⑴ 首先,打开VC,然后新建一个Win32 Dynamic-Link Library工程,然后在出现的工程类型中选择默认的空项目"A empty DLL project"(即不包含任何文件的工程),然后结束向导。
⑵ 手动添加两个文件,一个"C++ Source file",一个"Text file",请注意两个文件的后缀,在源文件命名时可以不写后缀名,那么就默认为CPP文件(即C++文件),也可以写上".C"来表示是C语言源文件(个人偏好是C语言,事实上系统DLL中都是用C语言写的,特别要指出的是,这里后缀不一样,源文件中内容也要相应改变,具体不同处后面会指出);Text file取名时请把后缀名改为DEF,因为这个文件是输出函数列表定义文件。
⑶ 好了,我们就只需要这两个文件就可以了!源文件用来定义函数和具体函数内容,而DEF文件中列出所要输出的函数。下面是代码了,首先要说明的是,DLL项目和传统的EXE工程一样,有自己的主函数(就相当于main()和WinMain()函数),名字是DllMain。
⑷ 思路如下,写一个DLL的主函数(这时就可以编译生成DLL文件了,只不过没有输出函数而已),然后在主函数体外声明"extern"的函数以及函数的实现部分,代码如下:
MyDll.C文件内容如下:
#include <windows.h> /*这个头文件不能少*/
extern int __stdcall GetNum(int Num); /*extern和__stdcall这两个关键词不能少哦!调用约定共有4种方式:__fastcall、__pascal、__stdcall、__cdecl,
VC++默认调用方式为__cdecl,而VB默认调用方式则为__stdcall。*/
/*DLL工程主函数,这里调用不调用我们要输出的函数无关紧要了。*/
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
int __stdcall GetNum(int Num) /*具体实现*/
{ return Num; }
MyDll.def内容:
EXPORTS
GetNum /*这样就表示了这个DLL文件的输出函数*/
/*如果输出函数有多个,就换行继续输入函数名称就可以了*/
⑸ 编码完成,编译完成以后,就可以在工作目录下的DEBUG目录下有一个MyDll.dll文件了,把这个文件复制到系统目录下,然后就可以打开VB调用一下这个dll文件输出的函数了。
这个要特别要注意的是:
extern int __stdcall GetNum(int Num);
extern "C" int __stdcall GetNum(int Num); /*多了一个“C”*/
这是因为他们的源文件是默认的C++文件(.cpp),所以为了符合C语言调用规则,就加了一个"C"字符,但是这里我用的源文件是纯的C语言文件(.c),所以不能再加"C",不然要报错的,请特别注意!
⑹好了,接下来的是VB这方面的事了,具体的我不多说了,就是一个函数声明而已了,还是得重复得声明一下:
请注意函数名称和参数都必须完全和你在DLL中定义的完全匹配!!特别是大小写要完全匹配!
Private Declare Function GetNum Lib "Mydll.dll" (ByVal Num As Integer) As Integer
对于DLL输出函数中的参数含有数据指针参数,那么在VB中声明把ByVal改为ByRef就可以将数组指针传递给DLL了~!譬如:
int __stdcall Array(int *a,int num);
Declare Function (ByRef SampleA() as Long, ByVal NumSam as Integer) as Integer
- VB(EXE)/VC(DLL)混合编程实例
- VC与Matlab混合编程实例(Matlab7.0函数转换成VC的.dll)
- DLL文件 VC++&Matlab混合编程( 调用DLL)
- VB VC 混合编程(dll)中 数组 的传入传出
- VB VC 混合编程(dll)中 数组 的传入传出
- VC++调用Matlab编写的DLL(混合编程)
- [混合编程]VC VB 数组
- VB和VC混合编程
- VB VC混合编程第一步
- VC++和Matlab混合编程(在VC中调用将.m文件生成的DLL)
- 用MASM编写的Utils.dll(VB+MASM混合编程)
- VB+VC混合编程疑难问题解
- Matlab2012生成DLL文件与VS2005(VC)混合编程解决方法(折腾两天的成果)
- VC调用matlab dll方式混合编程(c风格--例2)<二>
- vc之dll编程实例
- VC编程DLL通知应用程序exe通信(使用自定义消息实现)
- VC++动态链接库(DLL)编程(五)――DLL典型实例
- [今天的编程日记, 在vb中使用vc编译的dll实例]
- 3-29-20:19Struts的Validation机制
- 心情/摘
- P2P 之 UDP穿透NAT的原理与实现(附源代码)
- ASP中对大字段的存取AppendChunk和GetChunk
- VB中对大字段的存取AppendChunk和GetChunk
- VB(EXE)/VC(DLL)混合编程实例
- VxWorks上的STL错误
- SQL Server 2000之日志传送功能 - 描述(1)
- 国足、苏丹红、赞助商
- SQL Server 2000之日志传送功能 - 设定(2)
- SQL Server 2000之日志传送功能 - 问题解决
- SQL Server 2000之日志传送功能 - 设定(1)
- SQL Server 2000之日志传送功能 - 设定(3)
- SQL Server 2000之日志传送功能 - 描述(2)