Windows Api学习笔记-动态连接库(DLL)的使用

#include <windows.h>
#include <iostream>
#include "12dll.h"
using namespace std;

#pragma comment(lib,"12Dll")//要链接到什么库文件

void main()
{
	//CMy12Dll a;
	cout<<fnMy12Dll()<<endl;
	char b;
	cin>>b;
}

VS2008

新建WIN32项目

选择动态连接库

应用程序类型为:WINDOWS 应用程序

附加选项为:导出符号

dllmain.cpp中有动态连接库的入口函数

BOOL APIENTRY DllMain(HANDLE hModule,//DLL模块句柄
					  DWORD ul_reason_for_all,//调试原因
					  LPVOID lpReserved//没有使用
					  )
{
	switch(ul_reason_for_all)
	{
	case DLL_PROCESS_ATTACH://动态链接库刚被映射到某个进程的地址空间
		g_hModule = (HMODULE)hModule;
		break;
	case DLL_PROCESS_DETACH://动态链接库将被卸载
		break;
	}
	return TRUE;
}

 

动态连接库的主要逻辑函数如下:

#include "stdafx.h"
#include "12Dll.h"

// 这是导出变量的一个示例
MY12DLL_API int nMy12Dll=12345;

// 这是导出函数的一个示例。
MY12DLL_API int fnMy12Dll(void)
{
	return 67890;
}

// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 12Dll.h
CMy12Dll::CMy12Dll()
{
	return;
}

动态链接库的逻辑函数是通过如下代码在头文件中公开给外部的

// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 MY12DLL_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// MY12DLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef MY12DLL_EXPORTS
#define MY12DLL_API __declspec(dllexport)
#else
#define MY12DLL_API __declspec(dllimport)
#endif

// 此类是从 12Dll.dll 导出的
class MY12DLL_API CMy12Dll {
public:
	CMy12Dll(void);
	// TODO: 在此添加您的方法。
};

extern MY12DLL_API int nMy12Dll;

MY12DLL_API int fnMy12Dll(void);

如何使用刚刚创建的DLL

有两种办法

一:

把DLL,LIB,和声明导出函数的头文件一起复制到工程文件的主目录下

然后引入头文件

然后就可以想使用自己的函数一样使用动态连接库中的函数了

代码如下 

#include <windows.h>
#include <iostream>
#include "12dll.h"
using namespace std;

#pragma comment(lib,"12Dll")//要链接到什么库文件

void main()
{
	//CMy12Dll a;
	cout<<fnMy12Dll()<<endl;
	char b;
	cin>>b;
}

二:

在DLL工程中加入一个def文件

名字可以随便起

内容如下:

LIBRARY	"12Dll"
EXPORTS
  fnMy12Dll

重新生成DLL工程

重新开被到目标工程

目标工程代买改为如下

#include <windows.h>
#include <iostream>
using namespace std;

typedef int (*my_dll_func)(void);//预定义函数的名字

void main()
{
	HMODULE hModule = ::LoadLibrary("F:\\test\\10test\\10test\\12Dll.dll");
	if(hModule != NULL)
	{
		my_dll_func mf = (my_dll_func)::GetProcAddress(hModule,"fnMy12Dll");
		if(mf != NULL)
		{
			cout<<mf()<<endl;
		}
	}
	char b;
	cin>>b;
}

运行就看到答案了

时间: 2024-12-28 10:56:52

Windows Api学习笔记-动态连接库(DLL)的使用的相关文章

windows api学习笔记-遍历系统进程,获取进程名称和ID(进程快照)

#include <windows.h>//系统会自动连接到指定的库文件lib #include <tlhelp32.h>//声明快照函数的头文件 #include <stdio.h>//std io 标准输入输出接口 #include <iostream> using namespace std; int main() { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); HANDLE hProcessSna

windows api学习笔记-键盘钩子

DLL项目的头文件 #ifdef KEYHOOKLIB_EXPORT //此宏将在CPP文件中定义 #define KEYHOOKLIB_API __declspec(dllexport) #else #define KEYHOOKLIB_API __declspec(dllimport) #endif #define HM_KEY WM_USER+101 BOOL KEYHOOKLIB_API WINAPI SetKeyHook(BOOL bInstall,DWORD dwThreadId =

windows api学习笔记-终止其他进程

#include .h>.h>//系统会自动连接到指定的库文件lib #include .h>.h>//std io 标准输入输出接口 #include using namespace std; int main() { char szCommandLine[] = "cmd"; STARTUPINFO si = {sizeof(si)};// PROCESS_INFORMATION pi; si.dwFlags = STARTF_USESHOWWINDOW;/

windows api学习笔记-使用定时器

#include <windows.h> #include "resource.h" #include <string> LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数的函数原型 int APIENTRY WinMain( //APIENTRY是__stdcall的宏定义 HINSTANCE hInstance, //本模块的实例句柄 HINSTANCE hPrevInstance, //

windows api学习笔记-简单的记事本

#include <windows.h> #include "resource.h" #include <string> LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数的函数原型 int APIENTRY WinMain( //APIENTRY是__stdcall的宏定义 HINSTANCE hInstance, //本模块的实例句柄 HINSTANCE hPrevInstance, //

windows api学习笔记-多线程

#include <windows.h> #include <iostream> using namespace std; DWORD WINAPI ThreadProc(LPVOID lpParam) { int i = 0; while(i<20) { cout<<i<<endl; i++; } return 0; } int main() { HANDLE hThread; DWORD dwThreadId; hThread = ::Create

windows api学习笔记-用临界区对象使线程同步

#include <windows.h> #include <iostream> #include <process.h> using namespace std; int g_nCount1 = 0; int g_nCount2 = 0; CRITICAL_SECTION g_cs;//临界区 BOOL g_bContinue = TRUE;//线程结束标志 UINT WINAPI MyThread(LPVOID) { while(g_bContinue) { ::E

Windows录音API学习笔记--转

Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct {     WORD      wMid; 用于波形音频输入设备的设备驱动程序制造商标识符.     WORD      wPid; 声音输入设备的产品识别码.     MMVERSION vDriverVersion; 用于波形音频输入设备的设备驱动程序的版本号.高位字节是主版本号,低字节是次版本号.     CHAR      szPna

c++调用matlab生成的Dll动态连接库

点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台:   matlab 7.0(R2009a)   VC++6.0思路:1. 设置matlab的编译器,使用外部的VC或者gcc等编译器. 2. 编译m文件成dll 3. 设置VC的Include路径和lib链接库的路径 4. 编写C++调用dll步骤:1.    设置matlab的编译器在命令行窗口下,输入并执行如下命令:mex