DLL

来源:互联网 发布:烘焙软件 编辑:程序博客网 时间:2024/05/08 16:51

一、AfxInitExtensionModule

BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state, HMODULE hModule );

返回值:
如果成功地初始化了扩展DLL,则返回TRUE;否则返回FALSE。

参数: state对初始化后包含了扩展DLL模块状态的AFX_EXTENSION_MODULE结构的引用。这个状态中包含了扩展DLL在进入DllMain之前作为一般静态对象构造过程的一部分而初始化的运行类对象的拷贝。hModule扩展DLL模块的句柄。
说明:
在扩展DLL的DllMain中调用此函数以初始化DLL。例如:
static AFX_EXTENSION_MODULE extensionDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
   if(dwReason == DLL_PROCESS_ATTACH)
   {
     // 扩展DLL 一次性初始化
     if(!AfxInitExtensionModule(extensionDLL, hInstance)) return 0;
     ...
   }
}
AfxInitExtensionModule生成DLL的HMODULE的一个拷贝,并捕捉DLL的运行类(CRuntimeClass结构)和它的对象工厂(COleObjectFactory对象)以供创建CDynLinkLibrary时使用。
MFC的扩展DLL必须在它们的DllMain函数中做两件事情: ·调用AfxInitExtensionModule 并检验返回值。·如果DLL要引出CRuntimeClass对象或者具有它自己的资源,则创建一个CDynLinkLibrary对象。当每个进程与扩展DLL分离时(这发生在进程退出,或者因为调用了AfxFreeLibrary,DLL被卸载时),你可以调用AfxTermExtensionModule来清除扩展DLL。

 

二、GetModuleHandle

HMODULE GetModuleHandle (LPCTSTR lpModuleName);

  功能说明: 获取一个应用程序或动态链接库的模块句柄

  lpModuleName 模块名称

  返回值:如执行成功成功,则返回模块句柄。零表示失败。通过GetLastError获得错误信息

  如:

  GetModuleHandle(NULL); 这将返回自身应用程序句柄

      HINSTANCE hInstance3 = GetModuleHandle(_T("EAW.dll"));返回动态导入的库:EAW.dll的句柄

  注意

  前提是:只有欲获取的模块已映射到调用该函数的进程内,才会正确得到模块句柄。常用模块映射函数:LoadLibrary(..)。。。

 

三、LoadLibrary 和 AfxLoadLibrary

进程调用 LoadLibrary(或 AfxLoadLibrary)以显式链接到 DLL。 如果成功,则该函数将指定的 DLL 映射到调用进程的地址空间中并返回该 DLL 的句柄。此句柄可以与其他函数(如 GetProcAddressFreeLibrary)一起在显式链接中使用。

LoadLibrary 将尝试使用用于隐式链接的相同搜索序列来查找 DLL。 如果系统无法找到所需的 DLL 或者入口点函数返回 FALSE,则 LoadLibrary 将返回 NULL。 如果对 LoadLibrary 的调用所指定的 DLL 模块已映射到调用进程的地址空间中,则该函数将返回该 DLL 的句柄并递增模块的引用数。

如果 DLL 具有入口点函数,则操作系统将在调用 LoadLibrary 的线程的上下文中调用此函数。 如果由于以前调用了 LoadLibrary,但没有相应地调用 FreeLibrary 函数,从而导致已经将 DLL 附加到进程,则不会调用此入口点函数。

对于加载扩展 DLL 的 MFC 应用程序,建议使用 AfxLoadLibrary,而不使用 LoadLibrary。 在调用 LoadLibrary 之前,AfxLoadLibrary 处理线程同步。 AfxLoadLibrary 的接口(函数原型)与 LoadLibrary 相同。

如果 Windows 无法加载 DLL,则进程会尝试从错误中恢复。 例如,进程会通知用户所发生的错误,并要求用户指定 DLL 的其他路径。

如果代码要在 Windows NT 4、Windows 2000 或 Windows XP(SP1 以前的版本)下运行,则请确保为所有 DLL 指定完整路径名。 在这些操作系统中,加载文件时会首先搜索当前目录。 如果没有限定文件的路径,则可能会加载不需要的文件。

HINSTANCE hInstance = AfxLoadLibrary(DLL路径);

 

四、AfxGetInstanceHandle

HINSTANCE AfxGetInstanceHandle( );

例:HINSTANCE hInstance = AfxGetInstanceHandle();

  返回值:

  代表应用程序的当前实例的HINSTANCE值。如果是从与MFC的USRDLL版本连接的DLL内调用的,则返回代表DLL的HINSTANCE值。

  说明:

  这个函数使你能够获得当前应用程序的实例句柄。AfxGetInstanceHandle总是返回代表你的可执行文件(.EXE)的HINSTANCE值,除非它从与MFC的USRDLL版本连接的DLL内调用的。在这种情况下,它返回的是DLL的HINSTANCE值。

 

五、AfxGetResourceHandle

六、MAKEINTRESOURCE

 

原创粉丝点击