好久没有写过LabWindows/CVI的技术文章了,前几天,应一个网友之托,写了一个VB与LabWindows/CVI编制的DLL之间的通信问题。 我们都知道,在VB之中是没有指针类型的数据类型的,它所存在的只有两种数据传递机制,一为ByVal,也就是我们所说的传值方式,另一种为ByRef,也就是传址方式!在VB中,与其它外部模块的数据传递无非就是这两种! 而另一个很有意思的现象就是VB中是存在函数与过程两种方式的,即所谓的“Function”与“Sub”!其实,它们两个之间的区别并不是很大的,在LabWindows/CVI中,所谓的“Fuction”是指此函数是有返回值的,一般不能(其实也可以用)为“void”类型,而且需要有“return”返回其值!而“Sub”是不需要任何函数返回值的,我们称之为“过程”!对于一般的外部DLL调用而言,我们是采用“Function”的!但是,由于VB中不存在指针类型变量,所以,如果函数的返回值是一个指针的话,则,问题很难办!解决的方案通常是把函数的返回值指针写入到参数中,而函数的返回值一般是“Long”类型,编写一段代码,来判断在运行过程中,该代码是否被正确地执行了!我们如果常用Windows API的话,可以发现有很多函数都是出于这个目的而设计的! 好了,我也不多说了,下面是一个写好的DLL,用来传递日期字符串的例子! 头文件为: int __stdcall DateNow (char *str);//可在VB下使用 char __stdcall *DateNow2 (void);//一般不能在VB下使用 源代码为: #include "windows.h" #include #include #include int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: if (InitCVIRTE (hinstDLL, 0, 0) == 0) return 0; /* out of memory */ break; case DLL_PROCESS_DETACH: CloseCVIRTE (); break; } return 1; } int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { /* Included for compatibility with Borland */ return DllMain (hinstDLL, fdwReason, lpvReserved); } int __stdcall DateNow (char *str) { strcat (str, DateStr ()); return 0; } char __stdcall *DateNow2 (void) { char *str=DateStr (); return(str); } 在VB中调用的代码: 模块声明代码(int __stdcall DateNow (char *str)的VB声明): Declare Function DateNow& Lib "TransDate.dll" (ByVal x1$) 基本代码为: Dim x As String * 20 Private Sub Command1_Click() DateNow (x) Text1.Text = x End Sub 界面为: |