有一个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 时发生访问冲突被这个问题困扰了好几天了,郁闷~有没有人知道这个问题的解决方法~
谢谢~
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 时发生访问冲突被这个问题困扰了好几天了,郁闷~有没有人知道这个问题的解决方法~
谢谢~
应该怎么才能执行test.dll中的导出函数“InitializeAnvilExtension”?
hinst = 0x10000000 {unused=9460301 }
fun = 0x10001280
我怀疑是执行函数指针fun();有问题,因为它执行完后没有执行到释放句柄AfxFreeLibrary(hinst);
而是又跳转到fun=(myfunc)GetProcAddress(hinst,"InitializeAnvilExtension"); 这个位置,所以感觉是执行函数时出错。
但不知道怎么改
这一句不对,这样定义是C调用,而DLL中是WINAPI调用,呵呵
该知道如何改了吧
用这个也不行typedef void (CALLBACK *myfunc)();
这个是报错的图片:
我在编写一个将WOTRD转换为TXT文档的程序的时候也碰到了类似的问题.FindFile.exe 中的 0x7c2e7f41 (mfc71d.dll) 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突 。但是我的这个问题好象是和初始化函数AfxOleInit();有关,我在父窗体中运行就没问题,而到子窗体中运行就有访问冲突,不知道你的问题是不是也与这个有关
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);
} 不知道是什么原因,有人知道吗?
//
// 注意!
//
// 如果此 DLL 动态链接到 MFC
// DLL,从此 DLL 导出并
// 调入 MFC 的任何函数在函数的最前面
// 都必须添加 AFX_MANAGE_STATE 宏。
//
// 例如:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
// }
//
// 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。这意味着
// 它必须作为函数中的第一个语句
// 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC
// DLL 调用。
//
// 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。
//
; test.def : Declares the module parameters for the DLL.LIBRARY "test"EXPORTS
; Explicit exports can go here
InitializeAnvilExtension @1
是不是因为我要调用的dll缺少什么东西,所以一调用到创建窗口new CFrameWnd()就出错呢?
因为我调用这个dll里的其他导出函数(不调用窗口,只返回字符串)就好使,没有提示过上面的错误。
谢谢大家~再帮我看看吧>_<
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.rarextern 是MFC扩展dll的源代码;11 是调用dll的MFC应用程序源代码