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
#include
#include
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
#include
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
#include
#include
#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
#include
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
void main()
{
typedef int (*FUNT)(int ,int);// 函数指针类型
HINSTANCE Hint = LoadLibrary("DllProject5.dll");// 加载我们刚才生成的 dll
FUNT FunT1 = (FUNT)GetProcAddress(Hint,"FunT1");// 取得 dll 导出的 FunT1 方法
FunT1(5,4);
}
----------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------