我在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);

解决方案 »

  1.   

    static char maxCh[20];
    看不出加static的理由?lpBuffer进来的时候初始化了吗?有没有空间?我建议:
    lpBuffer初始化后再传进来
    maxCh多余
      

  2.   

    如果不用
    static char maxCh[20];
    并将此静态字符串指针的地址给要得到的
    lpBuffer非静态变量,将会出现在VC中调用
    后返回的地址内容不再是在DLL存在期间的内容
    而会是新占用此地址的内存值,我调试过这种方法lpBuffer是非静态变量采用C++中的引用方式传递内存地址
      

  3.   

    在VB中删除上面说的一行代码
    lpBuffer = maxCh;
    调用都正常
    但这个DLL明显的会因为没有初始化在VC中调用时出现致命错误
    在VB中为何不出现此致命错误呢?
      

  4.   

    我的意思是先给lpBuffer 分配一块内存,然后再传进来,赋值后传出去
      

  5.   

    相当于lpBuffer 是一个出口参数
      

  6.   

    在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'增加这一句,初始化指针 
    str=space(255)reL = GetUnKeyString(1, str, 20)
    str = Left(str,reL)lpBuffer = maxCh;这一句可以删除,在VC中调用的时候同样要先初始化指针,使其指向有效的内存空间
    lpbuffer=
      

  7.   

    lpBuffer需要先分配内存,然后初始化,而且,函数的声明要使用extern "C".
    extern "C" DLLEXPORT_API long GetUnKeyString