求助~关于MFC扩展dll调用时出现错误“访问冲突”

anwyo 2008-04-21 08:47:57
有一个MFC 扩展dll,其中有一导出函数InitializeAnvilExtension,内容如下:
void WINAPI InitializeAnvilExtension()
{
ShowMainWindow();//出现一个窗口;
}

现有MFC应用程序调用这个dll,主要内容如下:

HINSTANCE hinst=::AfxLoadLibraryEx(_T("test.dll"),NULL,DONT_RESOLVE_DLL_REFERENCES);
if(hinst !=NULL)
{
AfxMessageBox(_T("load dll"));
typedef void ( *myfunc)(); // WINAPI// CALLBACK
myfunc fun=NULL;
fun=(myfunc)GetProcAddress(hinst,"InitializeAnvilExtension");
if(fun)
{
AfxMessageBox(_T("load fun"));
fun();
}
AfxFreeLibrary(hinst);
}
加载dll的hinst 和函数指针fun都不为空值,但是执行到 fun()时出现错误,如下:
test.exe 中的 0x800002fa 处最可能的异常: 0xC0000005: 读取位置 0x800002fa 时发生访问冲突

被这个问题困扰了好几天了,郁闷~有没有人知道这个问题的解决方法~
谢谢~
...全文
665 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
lz要干嘛?
jwybobo2007 2008-04-26
  • 打赏
  • 举报
回复
你是如何导出的,另:如果定义时使用WINAPI,请到调用时

typedef void (WINAPI *myfunc)();
菜牛 2008-04-26
  • 打赏
  • 举报
回复
这是DLL资源句柄的问题。不知道你有没有注意到用向导建立“向导使用共享 MFC DLL 的规则 DLL”时在*App.cpp文件中添加的内容:
//
// 注意!
//
// 如果此 DLL 动态链接到 MFC
// DLL,从此 DLL 导出并
// 调入 MFC 的任何函数在函数的最前面
// 都必须添加 AFX_MANAGE_STATE 宏。
//
// 例如:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
// }
//
// 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。这意味着
// 它必须作为函数中的第一个语句
// 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC
// DLL 调用。
//
// 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。
//
anwyo 2008-04-26
  • 打赏
  • 举报
回复
我的代码下载的地址:
http://cachefile14.fs2you.com/zh-cn/download/4a87ef889bdab4d928cefec67fffa972/%E6%98%BE%E5%BC%8F%E8%B0%83%E7%94%A8MFC%E6%89%A9%E5%B1%95dll.rar

extern 是MFC扩展dll的源代码;11 是调用dll的MFC应用程序源代码
anwyo 2008-04-26
  • 打赏
  • 举报
回复
函数导出是在test.def文件中定义了下:


; test.def : Declares the module parameters for the DLL.

LIBRARY "test"

EXPORTS
; Explicit exports can go here
InitializeAnvilExtension @1




是不是因为我要调用的dll缺少什么东西,所以一调用到创建窗口new CFrameWnd()就出错呢?
因为我调用这个dll里的其他导出函数(不调用窗口,只返回字符串)就好使,没有提示过上面的错误。
谢谢大家~再帮我看看吧>_<
anwyo 2008-04-26
  • 打赏
  • 举报
回复
谢谢帮忙,可是我要调用的dll是mfc扩展dll。
anwyo 2008-04-25
  • 打赏
  • 举报
回复
经过查找发现好像是dll有点问题,dll里的这个导出函数,一到第二行
frame = new CFrameWnd();处就出现上面图里的错误。

void WINAPI InitializeAnvilExtension()
{
CFrameWnd* frame = NULL;
frame = new CFrameWnd();//错误好像就出在这里……
CRect rect(200, 200, 600, 400);
frame->Create(NULL, "test", WS_OVERLAPPEDWINDOW, rect, NULL);
frame->ShowWindow(SW_SHOW);
}

不知道是什么原因,有人知道吗?
anwyo 2008-04-24
  • 打赏
  • 举报
回复
谢谢ls各位~问题还没解决555
DQ_Quest 2008-04-24
  • 打赏
  • 举报
回复
不知道你的问题解决没.
我在编写一个将WOTRD转换为TXT文档的程序的时候也碰到了类似的问题.

FindFile.exe 中的 0x7c2e7f41 (mfc71d.dll) 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突 。

但是我的这个问题好象是和初始化函数AfxOleInit();有关,我在父窗体中运行就没问题,而到子窗体中运行就有访问冲突,不知道你的问题是不是也与这个有关
anwyo 2008-04-24
  • 打赏
  • 举报
回复
up~
anwyo 2008-04-24
  • 打赏
  • 举报
回复
up~
anwyo 2008-04-24
  • 打赏
  • 举报
回复
我用这个typedef void (WINAPI *myfunc)(); 试过了错误没变化。
用这个也不行typedef void (CALLBACK *myfunc)();
这个是报错的图片:
dknewu 2008-04-23
  • 打赏
  • 举报
回复
typedef void ( *myfunc)();
这一句不对,这样定义是C调用,而DLL中是WINAPI调用,呵呵
该知道如何改了吧
anwyo 2008-04-23
  • 打赏
  • 举报
回复
up~~
anwyo 2008-04-23
  • 打赏
  • 举报
回复
我看了加载dll和获得函数指针都不为空,值如下
hinst = 0x10000000 {unused=9460301 }
fun = 0x10001280
我怀疑是执行函数指针fun();有问题,因为它执行完后没有执行到释放句柄AfxFreeLibrary(hinst);
而是又跳转到fun=(myfunc)GetProcAddress(hinst,"InitializeAnvilExtension"); 这个位置,所以感觉是执行函数时出错。
但不知道怎么改
Chivalry 2008-04-23
  • 打赏
  • 举报
回复
使用简单的HINSTANCE hinst=::LoadLibrary(。。。); 试试看呢,看看是不是加载的问题
anwyo 2008-04-23
  • 打赏
  • 举报
回复
是不是fun(); 这句错了?
应该怎么才能执行test.dll中的导出函数“InitializeAnvilExtension”?
anwyo 2008-04-23
  • 打赏
  • 举报
回复
up~~~~~~~~~~~~~
请求帮助~~~~~~~~
sslzz119 2008-04-21
  • 打赏
  • 举报
回复
读写冲突?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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