DEV-C++
技术文档
——用
devc++
制作动态链接库的方法
文档作者:高纯
Email
:
sfme@qq.com
云南国防工业职业技术学院光电工程系(
07
级)
本文涉及一些
devc++
的相关技术,都是笔者经过一个假期,收集资料和实验得出的一些技术经验。由于
devc++
方面的资料较少,所以写成文档,拿出来供大家参考。好!我们开始。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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>
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
分享到:
相关推荐
### 用Dev-C++制作动态链接库(DLL)详解 #### 概述 动态链接库(Dynamic Link Library,简称DLL)是一种在Windows操作系统下广泛使用的共享库格式。它允许程序和其他模块共享代码和数据,从而提高了软件开发的效率...
这两个文件是GCC编译器的动态链接库,为程序提供必要的C++标准库支持和异常处理。在Windows操作系统中,这些库是支持程序运行的不可或缺的组件。没有它们,程序会因为找不到相关的运行时支持而无法启动。 此外,...
4. SDL.dll和SDL_image.dll:这两个是动态链接库文件,分别是SDL库和SDL_image扩展库的组成部分。SDL_image库用于加载和处理多种图像格式,如bmp。 5. game1.exe:这是编译后的可执行文件,用户可以直接运行来体验...
将glut.dll和glut32.dll动态链接库文件放入系统的system32文件夹。 在安装好GLUT后,接下来就是建立一个OpenGL工程项目。以Visual Studio 2005为例,新建一个工程时,选择Win32 Console Application,输入项目名称...
- **Windows DLLs**:介绍Windows下的动态链接库。 - **Linux Libraries**:重点讲述Linux下的静态和动态库。 **10. 比较五种开源协议** - **GPL**:最严格的开源许可之一。 - **MIT**:宽松型许可。 - **BSD**:...
在这个案例中,COM对象可能是一个自定义的DLL(动态链接库),封装了将ASCII字符显示为动画的逻辑。 项目涉及的主要技术包括: 1. **C++**:作为主要编程语言,C++提供了高效且灵活的编程能力,适合底层系统编程和...
首先,VB加载项是用Visual Basic 6(VB6)编写的动态链接库(DLL),这些库包含了实现特定功能的代码。通过在IDE中注册这些DLL,用户就能在开发环境中访问和使用自定义命令、工具栏、菜单等。创建VB加载项的步骤通常...