`
samwong
  • 浏览: 282213 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用devc++制作DLL动态链接库的方法

 
阅读更多

DEV-C++技术文档


DLL的制作:devc++也能制作动态链接库,现在我们来介绍用C语言做dll的方法。首先,打开devc++,文件->新建->工程,

在弹出的新工程对话框中选择“DLL”,选择实现语言为C语言,修改工程名为“MyProject”,确定,

选择保存目录,这里用名为“DLLDemo”文件夹。然后在devc++的代码编辑区会出现两个文件“dllmain.c”和“dll.h”。

----------------------------------------------------------------------------------------------------------------------

/****dllmain.c****/

/* Replace "dll.h" with the name of your header */

#include "dll.h"

#include <windows.h>

#include <stdio.h>

#include <stdlib.h>

DLLIMPORT void HelloWorld ()

{

MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);

// 模拟按键

keybd_event('R', 0, 0 ,0);
keybd_event('R', 0, KEYEVENTF_KEYUP,0);
//keybd_event(VK_LWIN, 0, 0 ,0);
//keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);

}

BOOL APIENTRY DllMain (HINSTANCE hInst/* Library instance handle. */ ,

DWORD reason/* Reason this function is being called. */ ,

LPVOID reserved/* Not used. */ )

{

switch (reason)

{

case DLL_PROCESS_ATTACH:

break;

case DLL_PROCESS_DETACH:

break;

case DLL_THREAD_ATTACH:

break;

case DLL_THREAD_DETACH:

break;

}

/* Returns TRUE on success, FALSE on failure */

return TRUE;

}

----------------------------------------------------------------------------------------------------------------------

/****dll.h****/

#ifndef _DLL_H_

#define _DLL_H_

#if BUILDING_DLL

# define DLLIMPORT __declspec (dllexport)

#else /* Not BUILDING_DLL */

# define DLLIMPORT __declspec (dllimport)

#endif /* Not BUILDING_DLL */

DLLIMPORT void HelloWorld (void);

#endif /* _DLL_H_ */

----------------------------------------------------------------------------------------------------------------------

其中“dllmain.c”是用来定义函数的(如语句:

DLLIMPORT void HelloWorld ()

{

MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);

}

)。

“dll.h”用来声明导出函数(如语句:DLLIMPORT void HelloWorld (void);)。现在我们来加入自己的函数FunT()和FunT1()。

在devc++编辑区的右边“工程管理”框中右击“MyProject”在弹出菜单中选择“新建单元”,像这样新建两个单元,在出现的空白编辑区里分别键入下面两段代码,并分别保存为“FunT1.c”和“FunT.c”。

----------------------------------------------------------------------------------------------------------------------

/****FunT1****/

#include "dll.h"

#include <windows.h>

#include <string.h>

int FunT1(int a,int b)

{

char output[1000];

char st[20];

int c=a+b;

_itoa(c, st, 10);

strcpy(output,"this sum of integer is :");

strcat(output,st);

MessageBox(NULL,output,"show console output in MessageBox",MB_OK);

return (0);

}

----------------------------------------------------------------------------------------------------------------------

/****FunT****/

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

#include "dll.h"

int FunT(int a,int b)

{

int c =a+b;

printf("%d",c);

//system("PAUSE");

return(c);

}

----------------------------------------------------------------------------------------------------------------------

注意到我的函数包含头文件有什么不同,多了一个“dll.h”这是必须的,然后在“dll.h”

中加入两句:“DLLIMPORT int FunT1(int,int);

DLLIMPORT int FunT(int,int);”(不包括引号)。

也就是加在示例函数声明“DLLIMPORT void HelloWorld (void);”的后面。

现在编译我们的“MyProject”,无错误的话(笔者编译通过)会在“DLLDemo”目录下生成一名为“Output”的文件夹,打开之会发现又一文件夹“MingW”,打开之出现五个文件,其中的两个就是我们需要的,一个为“libMyProject.a”另一个就是“MyProject.dll”。用“Dll导出函数查看器”查看“MyProject.dll”会发现其中有三个导出函数,其中两个是我们自定义的,一个是DLL工程自动添加的,你可以将其删除。

好的,现在我们来调用写好的dll。关闭当前工程,重新建立一个工程,选择控制台程序(Console Application),实现语言为C语言。命名为“testmain”。将其保存在“MyProject.dll”和“libMyProject.a”所在的目录下,在其中添加如下代码:

----------------------------------------------------------------------------------------------------------------------

/****testmain.c****/

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char *argv[])

{

FunT1(6,7);

//printf("%d\n",c);

//FunT(4,5);

//HelloWorld();

//system("PAUSE");

return 0;

}

----------------------------------------------------------------------------------------------------------------------

右击“工程管理框”中的工程名,选择“工程属性”在弹出的对话框中单击“附加的命令行选项”选项卡。单击“加入库或者对象”按钮选择“libMyProject.a”,编译运行之。

好了,关于用devc++制作dll,介绍完了。希望对大家有帮助,如果需要用其他程序调用(如wxWidget工程中),可以加入“extern "C" _declspec(dllexport) int FunT1 (int a,int b);”语句(不包含引号)调用。有时候得用VC使用我们制作好的dll,可是找不到.lib文件,怎么办呢?可以用以下语句调用:

----------------------------------------------------------------------------------------------------------------------

/****vctestmain.c****/

#include <Windows.h>

void main()

{

typedef int (*FUNT)(int ,int);//函数指针类型

HINSTANCE Hint = LoadLibrary("DllProject5.dll");//加载我们刚才生成的dll

FUNT FunT1 = (FUNT)GetProcAddress(Hint,"FunT1");//取得dll导出的FunT1方法

FunT1(5,4);

}

----------------------------------------------------------------------------------------------------------------------

<End>

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics