我在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);
解决方案 »
- view类不见了,fileview里也没有对应的.h和.cpp文件,编译也不正常
- 要对对话框进行初始化,怎么调哦?
- CTabCtrl控件的使用问题,请大家看看!代码片段如下:
- CSplitterWnd类的虚函数OnDrawSplitter的调用时机是什么?是不是有类似用Invalidate来调用OnDraw的做法?
- 如何用c++动态生成包含树形结构的html文档,!!!!急急急
- 帮我看看这个程序,看看他错在那里?
- 关于jdk与sdk
- 唉,我承认我低能,求教。
- 侯捷的源代码用了CTypedPtrList的GetHeadPosition(),可是查msdn上没有这个函数啊
- 在对话框界面上绘制OpenGL窗口时,弹出的模态对话框无法在窗口最前
- 高手请进:怎样让文件不被复制
- 有些编程书籍有需要的可以下载
看不出加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