我又一个DLL,主函数如下BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (DLL_PROCESS_ATTACH==ul_reason_for_call)
{
HandleOfDLL = LoadLibrary(L"Another.dll");
if(!HandleOfDLL)return FALSE;
}
}
问题如下:我用Loadlibrary动态加载没有问题。我用lib导入库,静态加载的时候,在 LoadLibrary(L"Another.dll")时,就出现了异常,类似于内存地址错误。谁能解释一下这个问题?谢谢
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (DLL_PROCESS_ATTACH==ul_reason_for_call)
{
HandleOfDLL = LoadLibrary(L"Another.dll");
if(!HandleOfDLL)return FALSE;
}
}
问题如下:我用Loadlibrary动态加载没有问题。我用lib导入库,静态加载的时候,在 LoadLibrary(L"Another.dll")时,就出现了异常,类似于内存地址错误。谁能解释一下这个问题?谢谢
1.Add the .lib to the linker
2.include the .h in the source file
3.copy the .lib and .dll to the path where the .exe is
你能保证被加载的那个DLL没有再载入这个DLL,如果有,那这两个DLL就一直相互加载下去,直到堆栈爆了。
这样的代码,msdn里面明确说过不可以的
LZ 工资设计好牛X呀 本来是link一起了 然后再LINK 一起
DLL的调用方式有两种:静态调用方式和动态调用方式
1)静态调用方式
由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码,简单实用,但不过灵活,只能满足一般要求。
隐式的调用:需要把产生动态链接库时产生的.lib文件加入到应用程序的工程中,想使用DLL中的函数时,只须说明一下。隐式调用不需要调用
LoadLibrary()和FreeLibrary()。程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的
符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。
当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。
LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。
当应用程序运行中需要加载DLL文件时,WINDOWS根据这些信息发现并加载DLL,然后通过符号名或标识名实现对DLL函数的动态链接。所有被应用程序
调用的DLL文件都会在应用程序EXE文件加载时被加载到内存中。可执行程序链接到一个包含DLL输出函数信息的输入库文件(.lib)。操作系统在加载会用
可执行文件时加载DLL。可执行程序直接通过函数名调用DLL的输出函数,调用方法和程序内部其他的函数是一样的。
2)动态调用方式
是由编程者用API函数加载和卸载DLL来达到调用DLL的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。
显式调用:是指在应用程序中用LoadLibrary()或MFC提供的AfxLoadLibrary()显示地将自己所做的动态链接库调进来,动态链接库的文件名即是上面
两个函数的参数,再用GetProcAddress()获取想要引入的函数。在应用程序退出之前,应用FreeLibrary()或MFC提供的AfxFreeLibrary()释放动态链接库。