用VB调用VC编写的DLL时,必须注意参数的匹配。VC中的变量,都是采用的32位,而VB中的,很多是16位,这就要进行相应的转化。转化的法则很多地方都有。我这里建议大家尽量使用VB,VC中都有,而且一致的变量。比如long型和double型。如果可能,尽量采用这些简单的变量类型。可以省缺很多麻烦。

要注意,传递变量值,在VB声明函数是,变量前加ByVal限定字,如果传递指针,要加ByRef限定字。默认为ByRef。

 

VB和DLL之间传递字符串的情况:

1。从VB传入字符串到DLL

比如下面的函数FuncA,传入字符串到DLL中,在VB中注意要用ByVal声明变量。声明为String型。

Public Declare Function  FuncA Lib "***.dll" (ByVal strS As String) As Boolean

在DLL中,

Bool WINAPI FuncA(LPSTR strS)
{
\\ 在这里可以直接使用strS
 return TRUE;
}

2。从DLL中传出字符串到VB

VB中的声明:

Public Declare Function FuncB Lib "***.dll" (ByVal strS As String) As Boolean
是不是和上面的声明一样,呵呵,没写错,就是一样的。

在DLL中,

Bool WINAPI FuncB(LPSTR strS)
{

*****
\\ 在程序的最后,可以返回strS。
 return TRUE;
}

在这里要注意的是,在VB中要先对strS进行初始化。给strS分配大小。例如,strS = Space$(260) ,这条语句,给strS分配了260个字符的大小。在DLL的函数中,要注意返回的strS的大小,不能超过这个限定。最好能做个判断。比较麻烦,但也没办法,申请个大点的空间吧。

还有一点要注意的是,在DLL中的FuncB中,千万不要对strS进行可能产生地址变更的操作!否则,strS的值不能返回到VB中。最好是在FuncB中使用临时的变量进行操作,程序的最后,把临时变量的值拷贝到strS中去。这样保险,以免出错。

BOOL WINAPI FuncB(  LPSTR   strS)
{
 LPSTR temp;
 在这里,对temp变量进行操作,程序的最好,把temp的值拷贝给strS;
 strcpy(strS, temp);
 return TRUE;
}
具体原因,是因为VB传递给DLL,实际上是strS这个变量的地址,(因为前面用的是ByVal限定词)也就是说是strS的指针。而使用前先分配大小,实际上是初始化指针,否则,是空指针,不能使用。在DLL函数中,如果出现了变更指针地址的操作,比如OLE2A,指针的赋值,指针的清空等等,都会引起strS地址的变更。这样,strS的值当然不可能传回VB中。

在VB中调用FuncB后,取得的是字符串后面会有一些空字符。比如,你申请了260个字符空间,结果,返回的字符串是“hello“,只有5个字符。那剩下的字符空间,都是空字符。可以使用下面的语句,去掉后面的空字符,只保留”hello“

str = left(strS, InStr(strS, Chr(0)) - 1)

总之,在VB和DLL之间传递数据,要尽量小心,尽量用简单类型。传递字符串时,在最开始,最后使用传递的字符串。中间过程建议采用临时变量替代。