我在VC++6.0中创建了一个Win32 Dyamlic-Link Library动态链接库工程
在工程中我定义了下面的一个函数
#define DLLEXPORT_API __declspec(dllexport)//得到二进制文件中指定的信息内容
DLLEXPORT_API long GetUnKeyString(
UINT charType, //要得到字符串的类型
LPTSTR & lpBuffer, //要从DLL中得到字符串的引用指针
long nSize); //所要得到字符串的最大长度函数体:
DLLEXPORT_API long GetUnKeyString(
UINT charType,
LPTSTR &lpBuffer,
long nSize)
{
static char maxCh[20];
if(nSize > 20)
nSize = 20;
for(int j=0 ; j<20;j++)
maxCh[j] = ' '; //初始化全为空格字符
//在VC++中要能正确调用本API函数,必须要下面一行,否则会出错
//而在VB中要调用本API函数,不能用下面一行代码,否则返回字符串为空,但不报错
lpBuffer = maxCh;
char buffer[20];
long chSize = -1;
switch(charType)
{
case 1: //GetChar为DLL中另一个函数
strcpy(lpBuffer,GetChar()) //函数原型:char * GetChar() {...}
break;
..... } chsize = strlen(lpBuffer);
return chsize;}下面的内容引自要使用动态链接库的VC++6.0和VB6.0两个工程中的相关调用代码
现象同上面的说明
***************************************************************
在VB中调用此动态链接库中的API函数在一模块文件中声明对动态链接库的引用
Public Declare Function GetUnKeyString Lib "Sample.dll"_
(ByVal charType as Integer,_
ByRef lpBuffer as String,_
ByVal nSize as long)在相关模块中使用声明的API函数
dim reL as long
dim str as string
reL = GetUnKeyString(1, str, 20)
str = Left(str,reL)
********************************************************************
在VC++中调用此动态链接库中的API函数
CString str;
LPTSTR getStr;
long getStrLen;
getStrLen = GetUnKeyString(1, getStr, 20);
m_str= CString(getStr);
在工程中我定义了下面的一个函数
#define DLLEXPORT_API __declspec(dllexport)//得到二进制文件中指定的信息内容
DLLEXPORT_API long GetUnKeyString(
UINT charType, //要得到字符串的类型
LPTSTR & lpBuffer, //要从DLL中得到字符串的引用指针
long nSize); //所要得到字符串的最大长度函数体:
DLLEXPORT_API long GetUnKeyString(
UINT charType,
LPTSTR &lpBuffer,
long nSize)
{
static char maxCh[20];
if(nSize > 20)
nSize = 20;
for(int j=0 ; j<20;j++)
maxCh[j] = ' '; //初始化全为空格字符
//在VC++中要能正确调用本API函数,必须要下面一行,否则会出错
//而在VB中要调用本API函数,不能用下面一行代码,否则返回字符串为空,但不报错
lpBuffer = maxCh;
char buffer[20];
long chSize = -1;
switch(charType)
{
case 1: //GetChar为DLL中另一个函数
strcpy(lpBuffer,GetChar()) //函数原型:char * GetChar() {...}
break;
..... } chsize = strlen(lpBuffer);
return chsize;}下面的内容引自要使用动态链接库的VC++6.0和VB6.0两个工程中的相关调用代码
现象同上面的说明
***************************************************************
在VB中调用此动态链接库中的API函数在一模块文件中声明对动态链接库的引用
Public Declare Function GetUnKeyString Lib "Sample.dll"_
(ByVal charType as Integer,_
ByRef lpBuffer as String,_
ByVal nSize as long)在相关模块中使用声明的API函数
dim reL as long
dim str as string
reL = GetUnKeyString(1, str, 20)
str = Left(str,reL)
********************************************************************
在VC++中调用此动态链接库中的API函数
CString str;
LPTSTR getStr;
long getStrLen;
getStrLen = GetUnKeyString(1, getStr, 20);
m_str= CString(getStr);
看不出加static的理由?lpBuffer进来的时候初始化了吗?有没有空间?我建议:
lpBuffer初始化后再传进来
maxCh多余
static char maxCh[20];
并将此静态字符串指针的地址给要得到的
lpBuffer非静态变量,将会出现在VC中调用
后返回的地址内容不再是在DLL存在期间的内容
而会是新占用此地址的内存值,我调试过这种方法lpBuffer是非静态变量采用C++中的引用方式传递内存地址
lpBuffer = maxCh;
调用都正常
但这个DLL明显的会因为没有初始化在VC中调用时出现致命错误
在VB中为何不出现此致命错误呢?
Public Declare Function GetUnKeyString Lib "Sample.dll"_
(ByVal charType as Integer,_
ByRef lpBuffer as String,_
ByVal nSize as long)在相关模块中使用声明的API函数
dim reL as long
dim str as string'增加这一句,初始化指针
str=space(255)reL = GetUnKeyString(1, str, 20)
str = Left(str,reL)lpBuffer = maxCh;这一句可以删除,在VC中调用的时候同样要先初始化指针,使其指向有效的内存空间
lpbuffer=
extern "C" DLLEXPORT_API long GetUnKeyString