DLL学习小结

来源:互联网 发布:java calendar api 编辑:程序博客网 时间:2024/06/05 14:16

  1.    DllMain的函数头BOOL APIENTRY DllMain( HANDLE hModule, WORD ul_reason_for_call, LPVOID eserved )。

 APIENTRY被定义为__stdcall,它意味着这个函数以标准Pascal的方式进行调用,也就是WINAPI方式;
 

       进程中的每个DLL模块被全局唯一的32字节的HINSTANCE句柄标识,只有在特定的进程内部有效,句柄代表了DLL模块在进程虚拟空间中的起始地 址。在Win32中,HINSTANCE和HMODULE的值是相同的,这两种类型可以替换使用,这就是函数参数hModule的来历。

2.

 

hDll = LoadLibrary("..//Debug//dllTest.dll");

if (hDll != NULL)

{

addFun = (lpAddFun)GetProcAddress(hDll, MAKEINTRESOURCE(1));

//MAKEINTRESOURCE直接使用导出文件中的序号

if (addFun != NULL)

{

int result = addFun(2, 3);

printf("/ncall add in dll:%d", result);

}

FreeLibrary(hDll);

}

MAKEINTRESOURCE是一个通过序号获取函数名的宏.

 3.

 __stdcall约定

  如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将 函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall方式与 __cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number;而 __cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。

Windows编程中常见的几种函数类型声明宏都是与__stdcall和__cdecl有关的(节选自windef.h):

#define CALLBACK __stdcall //这就是传说中的回调函数

#define WINAPI __stdcall //这就是传说中的WINAPI

#define WINAPIV __cdecl

#define APIENTRY WINAPI //DllMain的入口就在这里

#define APIPRIVATE __stdcall

#define PASCAL __stdcall

 

 

动态链接库(DLL)编程深入浅出(一)
http://blog.csdn.net/noter/archive/2007/10/10/1817785.aspx

原创粉丝点击