对于你这个问题是你的DLL库的*.def中应该在EXPORTS后加上Test;因为这种显示调用方式必须这样做!
解决方案 »
- 关于使用openssl库的问题……
- 谁能给我flash sdk ,有效的下载地址也可以,谢谢离
- 应用程序发生异常 unknown software exception(0xc00000fd)位置为0x012ecb3 这怎么解决
- 我刚开始学习网络编程,怎么一执行到Accept 程序就崩溃了?
- ActiveX在IE无法显示,在其他浏览器可以,为什么???
- List控件的问题
- 字符串同数值转换问题
- 在SDI中不能引用ActiveX控件的事件处理句柄吗?
- zip的压缩算法是基于最优树理论吗?
- 急!急!急!
- 问:装了win2000 advanced server ,win 2000 professional 不能上网?
- 请问在那里有邮件列表?像王海园一样的那种!
hDll=LoadLibrary("dll.dll");
if(hDll)
{
pTest=(LPTEST)GetProcAddress(hDll,"Test");
pTest(this->m_hWnd);
}
就不出错了要想调用成功,就确保你dll的位置正确
extern "C" int __declspec(dllexport) Test(HWND hWnd)
{
{
int a = 5;
a ++;
AFX_MANAGE_STATE( AfxGetStaticModuleState() );
}
CString str;
str.Format("%x",hWnd);
AfxMessageBox(str);
return 1;
}
对于 InitInstance函数和所有DLL中的消息处理函数
是不需要进行进程内模块状态与应用程序模块状态进行转换,但是
AfxMessageBox是全局的属于应用程序模块状态的函数,你必须将DLL模块状态压到不是当前的模块状态,推出AfxMessageBox的模块状态。
认真研究研究一下吧,我也是只有这么一点点概念,大家共同进步!
hDll=LoadLibrary("dll.dll");
if(hDll)
{
pTest=(LPTEST)GetProcAddress(hDll,"Test");
if( pTest != NULL )
{
pTest(this->m_hWnd);
}
}
EXPORTS段该如何声明呢?to ahao:这个程序流程有什么问题呢,能否具体点吗?谢谢!提示的错误大概的意思是说calling convention不符
所以我改为:
typedef int (*LPTEST)(HWND);
后就可以了我想问一下,如果我一定要这样调用,即:
typedef int (WINAPI* LPTEST)(HWND);
那DLL中的函数应该如何改呢?
hDll=LoadLibrary("dll.dll");
if(hDll)
{
pTest=(LPTEST)GetProcAddress(hDll,"Test");
}
pTest(this->m_hWnd);你自己看吧.
我试了一下,提示
error LNK2005: _DllMain@12 already defined in dll.obj
mfcs42.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in dll.obj
mfcs42.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in dll.obj; second definition ignored
mfcs42.lib(dllmodul.obj) : warning LNK4006: __pRawDllMain already defined in dll.obj; second definition ignored
Creating library Release/dll.lib and object Release/dll.exp
Release/dll.dll : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.dll.dll - 3 error(s), 2 warning(s)
EXPORTS
; Explicit exports can go here
Test
我的是Extension DLL
另外,我如果把AfxMessageBox函数去掉也不行呀
所以可能不是那个问题
对于隐式调用就不用修改*.def文件,直接把原来的*.h包括进来,然后再把生成的*.lib加道理的项目中即可编译成功.
对于显示调用必须在*.def文件中声明,然后在调用的地方用你原来的函数原型定义一个类型,再用这个类型定义变量,用LoadLibrary函数装载DLL库,用GetProcAddress获得函数地址,最后运行函数,当然应该在每一步都要检查地址的合法性!
DEBUG版提示是我前面所说的:calling convention不符欢迎大家继续讨论呀
函数定义时加__stdcall
hDll=LoadLibrary("dll.dll");
if(hDll)
{
pTest=(LPTEST)GetProcAddress(hDll,"Test");
if( pTest != NULL )
{
//必须如此:
(*pTest)(this->m_hWnd);
}
}
试过,也不行
to zhougaomin_007:
两种都可以调用,不知道有没有什么区别?
int Test(HWND hWnd)
{
CString str;
str.Format("%x",hWnd);
AfxMessageBox(str);
return 1;
}
在你的*.def中的Export段:
EXPORTS
; Explicit exports can go here
Test
应用程序端:
typedef int (* LPTEST)(HWND);
LPTEST pTest;
HINSTANCE hDll;hDll=LoadLibrary("dll.dll");
if(hDll)
{
pTest=(LPTEST)GetProcAddress(hDll,"Test");
if( pTest != NULL )
{
(*pTest)(this->m_hWnd);
}
}