why!why!why!!!!!

HKer_007 2002-09-08 11:30:24
我在DLL文件中写了如下代码访问ACCESS数据库:

#include "StdAfx.h"
#include "do.h" // 一些变量申明的头文件,一定正确,不必理会这里

extern "C" _declspec(dllexport)

char * ShowAllNames() // 读数据库中所有(库中只有3个学生)学生名字
{
names = new char [MAX]; // MAX = 255;
strcpy(names, "");
if(!m_pSet.IsOpen())
{
if(!m_pSet.Open()) return NULL;
}
if(m_pSet.IsBOF()) return NULL;
m_pSet.MoveFirst();
while(!m_pSet.IsEOF())
{
strcat(names, m_pSet.m_name);
strcat(names, " ");
m_pSet.MoveNext();
}
if(m_pSet.IsOpen()) m_pSet.Close();
return names;
}
在exe文件中访问这个DLL:
char * name;
typedef char * (SQRTPROC)();
SQRTPROC * pFunction;
VERIFY(hInstance = LoadLibrary
("F:\\exe_dll\\exe_dll\\dll\\Debug\\loaddb1.dll"));
VERIFY(pFunction = (SQRTPROC *)GetProcAddress
(hInstance,"ShowAllNames"));
name = (* pFunction)();

m_Edit.SetWindowText(name);
}
///////////////////////////////////////
exe执行时一切正常,m_Edit中也显示了数据库中的内容;
但一当关闭时就弹出“非法操作”框,写的是:

"0x77f7a22a引用的0x013a074f内存,该内存不能为'read',要终止程序,请按'确
定'
"
Why ?? 谢谢各位先!
...全文
55 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
impeng 2002-09-08
  • 打赏
  • 举报
回复
同意everandforever(Forever) 所说。

毕竟你是要在主程序里面来用这块内存。

去引用一块“外面”分配的内存总是不安全的。

如果dll地址空间被释放,你就会遇到访问非法内存的问题!
everandforever 2002-09-08
  • 打赏
  • 举报
回复
你先分配一块内存,然后通过参数传给 DLL中的函数,别让DLL自己分配。
impeng 2002-09-08
  • 打赏
  • 举报
回复
建议你把这两行放到后面去:

names = new char [MAX]; // MAX = 255;
strcpy(names, "");

毕竟你在这里用new分配了内存,而接下来的语句很有可能就return了,于是这段内存产生了泄漏。

不过可能这不是你遇到的问题!
HKer_007 2002-09-08
  • 打赏
  • 举报
回复
如果我把FreeLibary()加在m_Edit.SetWindowText(name);

后边,程序运行到这里就死了;不加还可以正常运行。

-------------------------------------------------------

还有: 我把char * ShowAllNames()函数直接放到exe文件中调用,

而不经过DLL文件动态连接却一点问题都没有! 真是奇怪啊!!!

我想是不是DLL的问题???
bigmm 2002-09-08
  • 打赏
  • 举报
回复
加上FreeLibary();
siphonelee 2002-09-08
  • 打赏
  • 举报
回复
应该是退出时内存释放有问题
你的动态链接库关闭操作有没有问题?
everandforever 2002-09-08
  • 打赏
  • 举报
回复
先把NAME复制出来,然后SETWINDOWTEXT?
HKer_007 2002-09-08
  • 打赏
  • 举报
回复
100分大甩卖,答对还可加哈!
everandforever 2002-09-08
  • 打赏
  • 举报
回复
释放了不属于你的内存?
guanying 2002-09-08
  • 打赏
  • 举报
回复
最好不要返回char *,返回引用试试
HKer_007 2002-09-08
  • 打赏
  • 举报
回复
还是不对......@_@!

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧