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