getprocaddress 返回 null
场景:GetProcAddress函数返回值总替null
GetProcAddress函数返回值总为null?
//MFCdll工程里的导出函数原型,CDllDialog是该工程里的一个类,这个工程生成MFC规则Dll,后面在MFCdllCall动态调用
void _declspec(dllexport)ShowDialog()
{
CDllDialog mydlg;
mydlg.DoModal();
}
//MFCdllCall工程中调用的代码如下:
void CMFCdllCallDlg::OnBnClickedHello()
{
// TODO: 在此添加控件通知处理程序代码
typedef void (*lpFun)();
lpFun pfun;
HINSTANCE hdll;
hdll=LoadLibrary(_T("MFCdll.dll"));
if(hdll==NULL)
{
MessageBox(_T("加载MFCdll.dll文件失败!"));
}
pfun=(lpFun)GetProcAddress(hdll,"ShowDialog");
if(pfun==NULL)
{
DWORD t=GetLastError();
MessageBoxW(_T("函数调用失败!"));
OnOK();
return ;
}
pfun();
FreeLibrary(hdll);
}
//vs6.0上时行过类似的调试能够成功且不需要_T(),这里运行时pfun值总为null,t值为127,我觉得应该是找不到函数ShowDialog的意思,应该怎么改呢
------解决方案--------------------
很简单,_declspec(dllexport) 这个东东,虽然可以不用在*.def文件中定义输出函数
问题是,它会把函数的名字更改掉,所以GetProcAddress找不到地址
试试换下面的方法:
#ifndef WINAPI
#define WINAPI __stdcall
#endif
void WINAPI ShowDialog()
{
.....
}
另外在*.def文件中定义输出函数
EXPORTS
ShowDialog
调用:
typedef void (WINAPI *lpFun)();
GetProcAddress函数返回值总为null?
//MFCdll工程里的导出函数原型,CDllDialog是该工程里的一个类,这个工程生成MFC规则Dll,后面在MFCdllCall动态调用
void _declspec(dllexport)ShowDialog()
{
CDllDialog mydlg;
mydlg.DoModal();
}
//MFCdllCall工程中调用的代码如下:
void CMFCdllCallDlg::OnBnClickedHello()
{
// TODO: 在此添加控件通知处理程序代码
typedef void (*lpFun)();
lpFun pfun;
HINSTANCE hdll;
hdll=LoadLibrary(_T("MFCdll.dll"));
if(hdll==NULL)
{
MessageBox(_T("加载MFCdll.dll文件失败!"));
}
pfun=(lpFun)GetProcAddress(hdll,"ShowDialog");
if(pfun==NULL)
{
DWORD t=GetLastError();
MessageBoxW(_T("函数调用失败!"));
OnOK();
return ;
}
pfun();
FreeLibrary(hdll);
}
//vs6.0上时行过类似的调试能够成功且不需要_T(),这里运行时pfun值总为null,t值为127,我觉得应该是找不到函数ShowDialog的意思,应该怎么改呢
------解决方案--------------------
很简单,_declspec(dllexport) 这个东东,虽然可以不用在*.def文件中定义输出函数
问题是,它会把函数的名字更改掉,所以GetProcAddress找不到地址
试试换下面的方法:
#ifndef WINAPI
#define WINAPI __stdcall
#endif
void WINAPI ShowDialog()
{
.....
}
另外在*.def文件中定义输出函数
EXPORTS
ShowDialog
调用:
typedef void (WINAPI *lpFun)();