一、概论

  1:http://www.pconline.com.cn/pcedu/empolder/gj/vc/0509/698632.html

  2:http://pcedu.pconline.com.cn/empolder/gj/vc/0509/699672.html

  3:http://pcedu.pconline.com.cn/empolder/gj/vc/0509/703607.html

  4:http://pcedu.pconline.com.cn/empolder/gj/vc/0511/720057.html

二、__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


  在lib.h中,应这样声明add函数:

    int __stdcall add(int x, int y);


  在应用工程中函数指针类型应定义为:

    typedef int(__stdcall *lpAddFun)(int, int);


  若在lib.h中将函数声明为__stdcall调用,而应用工程中仍使用typedef int (* lpAddFun)(int,int),运行时将发生错误(因为类型不匹配,在应用工程中仍然是缺省的__cdecl调用),弹出下图所示的对话框。

  

  http://pcedu.pconline.com.cn/empolder/gj/vc/0509/699672_6.html

三、应用

  1、DLL端

  example.cpp:

//定义输出库函数,以被MFC程序调用
//extern "C" __declspec(dllexport) int example(char *a, int b)
extern "C" int __stdcall example(char *a, int b)  //函数的调用方式声明为__stdcall方式
{
    //AFX_MANAGE_STATE(AfxGetStaticModuleState());
    int num = 1;
    // b = "test.dll";
    strcpy_s(b, 260, "test.dll"); //char *a的定义是char* a[260]
    return num;
}

  example.def:

LIBRARY

EXPORTS
    example

  2.DLL调用端

  loadDll.cpp

//typedef int(*lpAddFun)(int, int); //宏定义函数指针类型
typedef int (CALLBACK* example)(char*, int); //宏定义函数指针类型
int main(char *a[260], int b) {   HINSTANCE hDll; //DLL句柄   example fun; //函数指针   hDll = LoadLibrary("..\Debug\test.dll");   if (hDll != NULL)   {     fun = (example)GetProcAddress(hDll, "example");     if (fun != NULL)     {       int result = fun(a, b);       printf("%d", result);     }     FreeLibrary(hDll);   }   return 0; }

 

  

  

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程