说得太笼统。如果A.DLL需要调用B.DLL,则要看A是显示使用B还是隐式使用B。
如果A显示调用B,则A必须通过LoadLibrary的方式来加载B,但是这个过程不能在入口点函数中执行,否则系统会死锁,这个现象俗称DLL地狱。
如果A隐式调用B,则A在编码期间就必须通过引用B.LIB的方式编译,此时A可以直接调用B中的任何导出函数,因为A被加载时系统也会自动加载B并且重定位B中的所有导出符号位置。
如果A显示调用B,则A必须通过LoadLibrary的方式来加载B,但是这个过程不能在入口点函数中执行,否则系统会死锁,这个现象俗称DLL地狱。
如果A隐式调用B,则A在编码期间就必须通过引用B.LIB的方式编译,此时A可以直接调用B中的任何导出函数,因为A被加载时系统也会自动加载B并且重定位B中的所有导出符号位置。
解决方案 »
- GDI+使用问题//HRSRC是一个句柄类型,如何使用呀?
- WINCE 自绘的图片按钮,为什么点某个按钮的时候,另外的按钮会闪烁
- 指纹识别驱动加载失败???求救??
- 在VC的MFC中怎样将 wchar_t to string
- 如何获取一个EDIT控件的状态?
- help:socket send方法疑问
- 大神门,到底哪里错啦调啦一天,菜鸟求求你们啦
- 有关Ado的问题
- 急!在线等!偶基于CPropertySheet生成了一个继承类,但编译后出现如下错误,百思不得解,大虾指教!
- 高分请教:ADO调用存储过程,参数传递顺序导致数据类型转换错误DB_E_CANTCONVERTVALUE
- 一个pdf 编程的问题
- 有没有比较活跃的vc。mfc 群介绍几个 谢谢
是自己用C写的DLL
根本与exe调用dll没区别。
创建test工程在CTestApp theApp;后添加函数代码:如extern "C" __declspec(dllexport) int Add(int a, int b)
{
return a+b;
}编译,生成调用:创建新工程test2
1,把生成的test.dll, test.lib拷贝到test2目录下
2,把test.lib添加到test2工程中:project->add to project->files->test.lib
3,调用动态库函数前声明函数:extern "C" __declspec(dllimport) int Add(int a, int b);
4:void CTest5Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
int x,y,z; y=13;
x = 12; z=Add(x,y);}
用隐式调用吧
举个例子:
HINSTANCE hInst = LoadLibrary(_T("RxDLL.DLL"));
if(hInst)
{
typedef BOOL (MYFUNC)(CString);//声明DLL中的函数原形
MYFUNC* UninstallFont = (MYFUNC *)::GetProcAddress(hInst, _T("UninstallFont"));//获取该函数的入口地址
UninstallFont(_T("xjlFont.fon"));//调用函数
}
FreeLibrary(hInst);//必须和LoadLibrary搭配没想到这个帖子都一年!楼主这次可以揭帖了吧。