先讲一个基本的动态库,功能为自定义一个动态库,里面有一个函数MyMessage实现弹出MessageBox。

1、 先在头文件中定义:

#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

2、在头文件中定义自己的需要函数,比如:EXPORT VOID MyMessage(HWND hwnd,LPCTSTR lstr);

3、在.cpp文件中实现自定义函数

    EXPORT VOID MyMessage(HWND hwnd,LPCTSTR lstr)
    {
      MessageBox(hwnd,lstr,"tip",MB_OK);
    }

4、新建项目使用该动态库。

   (1)、附加包含目录。右击属性 -> 配置属性 -> C/C++ -> 常规 -> 附加包含目录。然后选择动态库的头文件目录添加进去。

(2)、加载动态库。定义HMODULE g_hModule = NULL;在OnCreate函数中加载

if(g_hModule == NULL)
{
g_hModule = ::LoadLibrary("mydll.dll");
}

   (3)、加载函数与使用

VOID(*MYMESSAGE)(HWND,LPCTSTR);
MYMESSAGE = (VOID(*)(HWND,LPCTSTR))::GetProcAddress(g_hModule,"MyMessage");
MYMESSAGE(hwnd,"hello world");

  其中MYMESSAGE为函数指针。

     (4)、在destroy的时候卸载动态库

if(g_hModule)
{
::FreeLibrary(g_hModule);
g_hModule = NULL;
}

  在动态库中加入资源,如何加载

  提示:如果动态库为没有函数,则不要设置项目依赖,因为动态库没有函数不生成lib文件。在动态库中加入资源后,把资源文件resource改名,避免与调用dll文件的程序重名。

  用法差不多,加载资源的时候把HINSTANCE改成HMODULE就行了。

  

#include<tchar.h>
#include<stdio.h>
#include<windows.h>
#include"resource.h"
#include"dllresource.h"
HINSTANCE g_hInstance = NULL;
HMODULE g_hModule = NULL;
LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
g_hInstance = hInstance;
WNDCLASS wndcls;
wndcls.cbClsExtra = ;
wndcls.cbWndExtra = ;
wndcls.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndcls.hCursor = LoadCursor(NULL,IDC_ARROW);
wndcls.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndcls.hInstance = hInstance;
wndcls.lpfnWndProc = WinSunProc;
wndcls.lpszClassName = _T("sunxin2006");
wndcls.lpszMenuName = NULL;
wndcls.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls); HWND hwnd = CreateWindow(_T("sunxin2006"),_T("helloworld"),WS_OVERLAPPEDWINDOW,
,,,,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd); MSG msg;
while(GetMessage(&msg,NULL,,)>)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
} VOID OnCreate(HWND hwnd,WPARAM wParam,LPARAM lParam)
{
int scrWidth,scrHeight;
RECT rect;
//获得屏幕尺寸
scrWidth = GetSystemMetrics(SM_CXSCREEN);
scrHeight = GetSystemMetrics(SM_CYSCREEN);
//取得窗口尺寸
GetWindowRect(hwnd,&rect);
//重新设置rect里的值
rect.left = (scrWidth-rect.right)/;
rect.top = (scrHeight-rect.bottom)/;
//移动窗口到指定的位置
SetWindowPos(hwnd,HWND_TOP,rect.left,rect.top,rect.right,rect.bottom,SWP_SHOWWINDOW);
g_hModule = LoadLibrary("testdll2.dll");
}
POINT DrawBmp(HDC hdc,int x,int y,int bmpID)
{
HDC hMemdc = CreateCompatibleDC(hdc);
//HBITMAP hBitmap = CreateCompatibleBitmap(hdc,rtClient.right,rtClient.bottom);
HBITMAP hBitmap = LoadBitmap(g_hInstance,MAKEINTRESOURCE(bmpID));
BITMAP bmp;
GetObject(hBitmap,sizeof(BITMAP),&bmp);
SelectObject(hMemdc,hBitmap); BitBlt(hdc,x,y,bmp.bmWidth,bmp.bmHeight,hMemdc,,,SRCCOPY);
DeleteObject(hBitmap);
DeleteDC(hMemdc);
POINT pt;
pt.x = x+bmp.bmWidth;
pt.y = y+bmp.bmHeight;
return pt;
} POINT DrawBmpFromDll(HDC hdc,int x,int y,int bmpID)
{
HDC hMemdc = CreateCompatibleDC(hdc);
HBITMAP hBitmap = LoadBitmap(g_hModule,MAKEINTRESOURCE(bmpID));
BITMAP bmp;
GetObject(hBitmap,sizeof(BITMAP),&bmp);
SelectObject(hMemdc,hBitmap); BitBlt(hdc,x,y,bmp.bmWidth,bmp.bmHeight,hMemdc,,,SRCCOPY);
DeleteObject(hBitmap);
DeleteDC(hMemdc);
POINT pt;
pt.x = x+bmp.bmWidth;
pt.y = y+bmp.bmHeight;
return pt;
}
VOID OnPaint(HWND hwnd,WPARAM wParam,LPARAM lParam)
{
RECT rtClient;
GetClientRect(hwnd,&rtClient);
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd,&ps);
/*int IDs[] = {IDB_BMP1,IDB_BMP2,IDB_BMP3};
POINT pt = {0,0};
for(int i=0;i<sizeof(IDs)/sizeof(int);++i)
{
pt = DrawBmp(hdc,pt.x,pt.y,IDs[i]);
}
*/
int IDs[] = {IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4,IDB_BITMAP5,
IDB_BITMAP6,IDB_BITMAP7,IDB_BITMAP8,IDB_BITMAP9};
POINT pt = {,};
for(int i=;i<sizeof(IDs)/sizeof(int);++i)
{
pt = DrawBmpFromDll(hdc,pt.x,pt.y,IDs[i]);
}
EndPaint(hwnd,&ps);
}
LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
OnCreate(hwnd,wParam,lParam);
break;
case WM_PAINT:
OnPaint(hwnd,wParam,lParam);
break;
case WM_DESTROY:
if(g_hModule)
{
FreeLibrary(g_hModule);
g_hModule = NULL;
}
PostQuitMessage();
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return ;
}

   windows动态库共享内存

windows共享内存,数据必须初始化,并且定义时需要特定格式,可以通过动态库共享内存,设计程序只被启动一次。在动态库的头文件或者cpp文件中加上以下代码。

#pragma data_seg("mysharedata") 

int app_count = ;    //共享内存, 必须初始化,否则共享内存失败

#pragma data_seg()   

#pragma comment(linker,"/SECTION:mysharedata,RWS") 

  动态库导出类

  1、动态库中定义

#ifdef MYEXPORT
#define EXPORT __declspec (dllexport)
#else
#define EXPORT __declspec (dllimport)
#endif

  2、动态库中新建类中头文件

class EXPORT MyClassTestDll
{
public:
MyClassTestDll(void);
~MyClassTestDll(void);
int Add(int,int);
};

3、在动态库.cpp文件中实现上述类,并定义宏MYEXPORT

#define MYEXPORT
MyClassTestDll::MyClassTestDll(void)
{
} MyClassTestDll::~MyClassTestDll(void)
{
}
int MyClassTestDll::Add(int num1,int num2)
{
return num1 + num2;
}

4、在测试程序中设置附加附加包含目录与附加库目录,分别在属性的c/c++与链接器的常规中设置。

5、在测试程序中使用

#pragma comment(lib,"testclassdll3.lib") 

MyClassTestDll  myclasstestdll;
int sum = myclasstestdll.Add(,);
if(sum == )
MessageBox(hwnd,"调用成功","",MB_OK);

动态库入口函数中获取HINSTANCE

HINSTANCE g_hInstance= NULL;

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hInstance= = (HINSTANCE)hModule;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

win32动态库的更多相关文章

  1. 编译Win32动态库工程的两个链接错误的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 今天编译一个Win32动态库工程,出现两个链接错误的解决,一个是: main.obj: error LNK2001: ...

  2. C++windows内核编程笔记day11 win32静态库和动态库的使用

    windows库程序: 静态库: 源码被链接到调用的程序或动态库,被调用时,代码最少有1份,文件后缀.LIB 动态库: 函数被程序或其它动态库调用,被调用时,代码仅仅有1份,文件后缀.DLL 静态库( ...

  3. C++ 系列:静态库与动态库

    转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...

  4. Qt——动态库的创建和使用

    一.动态库是什么 很多人写程序的人都见过.lib和.dll文件,对动态库也略有耳闻. 生成动态库后可以得到两个文件,后缀名分别是.lib以及.dll. 简而言之,.lib称为导入库,相当于头文件:.d ...

  5. C++静态库与动态库

    C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...

  6. VS2015——命令行下编译、静态库动态库制作以及断点调试

    c程序编译流程 程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序.经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的 ...

  7. c/c++:动态库 静态库 linux/windows 例子 (转)

    作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...

  8. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...

  9. C++(VS2012)DLL动态库的生成和调用

    DLL动态链接库的生成: 首先打开VS2012,新建——项目——Win32控制台应用程序(项目名称:ConsoleApplication1)——空项目 新建一个源文件source.cpp 先用控制台e ...

随机推荐

  1. 洛谷——P1255 数楼梯

    题目描述 楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶. 编一个程序,计算共有多少种不同的走法. 输入输出格式 输入格式: 一个数字,楼梯数. 输出格式: 走的方式几种. 输入输出样例 输入样例# ...

  2. [JavaEE] Injecting Bean

    So what is a Bean, in JavaEE, any class expect Entity are Bean. One usefully thing in Bean is Depend ...

  3. 解决MyEclipse中导入项目@Override错误

    做项目的时候,同事那边电脑上编译通过的java代码,或者是网上下载的例子代码,导入project后却是编译不通过,总是@override报错,把@override去掉就好了,有时候@Override出 ...

  4. Shiro学习(22)集成验证码

    在做用户登录功能时,非常多时候都须要验证码支持,验证码的目的是为了防止机器人模拟真有用户登录而恶意訪问,如暴力破解用户password/恶意评论等. 眼下也有一些验证码比較简单,通过一些OCR工具就能 ...

  5. 【源代码剖析】tornado-memcached-sessions —— Tornado session 支持的实现(二)

    客官您最终回头了! 让我们本着探(zuo)索(si)精神把 session.py 看完吧... 首先看看须要的库: pickle 一个用于序列化反序列化的库(听不懂?你直接看成和 json 一样作用即 ...

  6. 【敬业福bug】支付宝五福卡敬业福太难求 被炒至200元

    016年央视春晚官方独家互动合作伙伴--支付宝,正式上线春晚红包玩法集福卡活动. 用户新加入10个支付宝好友,就可以获成3张福卡.剩下2张须要支付宝好友之间相互赠送.交换,终于集齐5张福卡就有机会平分 ...

  7. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

  8. bzoj3105 [cqoi2013]新Nim游戏——贪心+线性基

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3105 首先,要先手必胜,就不能取后让剩下的火柴中存在异或和为0的子集,否则对方可以取成异或和 ...

  9. Spark SQL 操作Hive 数据

    Spark 2.0以前版本:val sparkConf = new SparkConf().setAppName("soyo")    val spark = new SparkC ...

  10. java静态代理实例

    package test; class ProxyTest { public static void main(String[] args) { ProxyClass proxy = new Prox ...