首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[原创]利用LabWindows/CVI制作的DLL与VB的通信问题

[原创]利用LabWindows/CVI制作的DLL与VB的通信问题

好久没有写过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
  界面为:


 
转自:小信的博客
网址:http://blog.sina.com.cn/u/1265070197
谢谢
返回列表