创建DLL详解(3)

来源:互联网 发布:人工智能 传统制造业 编辑:程序博客网 时间:2024/06/03 13:05

前面我们讲过了DLL导出函数和DLL导出类,今天我们讲讲纯资源DLL的写法
首先创建DLL这里写图片描述
这里写图片描述
这样工程就创建完成
我们在资源文件里添加了两个图片,在这里我们记住第二张图片的ID
IDB_BITMAP2
这里写图片描述
注意这里要设置无入口点为true
设置流程
这里写图片描述
这里写图片描述
点击确定
这里写图片描述
点击编译,编译完成,可以再其他工程中使用这个DLL了
接下来我们测试下这个DLL
找到刚才工程的resource.h文件,找到IDB_BITMAP2
这里写图片描述
这样我们就知道了刚才那个图片的资源ID为102
然后新建一个win32工程,测试

#include "stdafx.h"#include "Win32Project1.h"#define MAX_LOADSTRING 100#define IDB_BITMAP1                     101//自己添加的#define IDB_BITMAP2                     102//自己添加的// 全局变量: HINSTANCE hInst;                                // 当前实例TCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本TCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名HMODULE hDLL;//自己添加的HBITMAP hBitmap;//自己添加的// 此代码模块中包含的函数的前向声明: ATOM                MyRegisterClass(HINSTANCE hInstance);BOOL                InitInstance(HINSTANCE, int);LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,                     _In_opt_ HINSTANCE hPrevInstance,                     _In_ LPTSTR    lpCmdLine,                     _In_ int       nCmdShow){    UNREFERENCED_PARAMETER(hPrevInstance);    UNREFERENCED_PARAMETER(lpCmdLine);    // TODO:  在此放置代码。    MSG msg;    HACCEL hAccelTable;    // 初始化全局字符串    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);    LoadString(hInstance, IDC_WIN32PROJECT1, szWindowClass, MAX_LOADSTRING);    MyRegisterClass(hInstance);    // 执行应用程序初始化:     if (!InitInstance (hInstance, nCmdShow))    {        return FALSE;    }    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT1));    // 主消息循环:     while (GetMessage(&msg, NULL, 0, 0))    {        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))        {            TranslateMessage(&msg);            DispatchMessage(&msg);        }    }    return (int) msg.wParam;}////  函数:  MyRegisterClass()////  目的:  注册窗口类。//ATOM MyRegisterClass(HINSTANCE hInstance){    WNDCLASSEX wcex;    wcex.cbSize = sizeof(WNDCLASSEX);    wcex.style          = CS_HREDRAW | CS_VREDRAW;    wcex.lpfnWndProc    = WndProc;    wcex.cbClsExtra     = 0;    wcex.cbWndExtra     = 0;    wcex.hInstance      = hInstance;    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT1));    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_WIN32PROJECT1);    wcex.lpszClassName  = szWindowClass;    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));    return RegisterClassEx(&wcex);}////   函数:  InitInstance(HINSTANCE, int)////   目的:  保存实例句柄并创建主窗口////   注释: ////        在此函数中,我们在全局变量中保存实例句柄并//        创建和显示主程序窗口。//BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){   HWND hWnd;   hInst = hInstance; // 将实例句柄存储在全局变量中   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);   if (!hWnd)   {      return FALSE;   }   ShowWindow(hWnd, nCmdShow);   UpdateWindow(hWnd);   return TRUE;}////  函数:  WndProc(HWND, UINT, WPARAM, LPARAM)////  目的:    处理主窗口的消息。////  WM_COMMAND  - 处理应用程序菜单//  WM_PAINT    - 绘制主窗口//  WM_DESTROY  - 发送退出消息并返回////LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    int wmId, wmEvent;    PAINTSTRUCT ps;    static HDC hdc;    static HDC hdcMem;    static BITMAP bitmap;    switch (message)    {    case WM_CREATE://自己添加的        hDLL = LoadLibrary(TEXT("ResourceDLL.dll"));        hdcMem = CreateCompatibleDC(hdc);        hBitmap = (HBITMAP)LoadImage(hDLL, MAKEINTRESOURCE(IDB_BITMAP2), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);        if (NULL == hBitmap)        {            MessageBox(NULL, TEXT("获取资源失败"), szTitle, MB_OK);        }        SelectObject(hdcMem, hBitmap);        break;    case WM_COMMAND:        wmId    = LOWORD(wParam);        wmEvent = HIWORD(wParam);        // 分析菜单选择:         switch (wmId)        {        case IDM_ABOUT:            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);            break;        case IDM_EXIT:            DestroyWindow(hWnd);            break;        default:            return DefWindowProc(hWnd, message, wParam, lParam);        }        break;    case WM_PAINT://自己添加的画图片部分        hdc = BeginPaint(hWnd, &ps);        // TODO:  在此添加任意绘图代码...        GetObject(hBitmap, sizeof(BITMAP), &bitmap);        BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);        EndPaint(hWnd, &ps);        break;    case WM_DESTROY://自己添加的资源释放部分        FreeLibrary(hDLL);        DeleteObject(hBitmap);        PostQuitMessage(0);        break;    default:        return DefWindowProc(hWnd, message, wParam, lParam);    }    return 0;}// “关于”框的消息处理程序。INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){    UNREFERENCED_PARAMETER(lParam);    switch (message)    {    case WM_INITDIALOG:        return (INT_PTR)TRUE;    case WM_COMMAND:        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)        {            EndDialog(hDlg, LOWORD(wParam));            return (INT_PTR)TRUE;        }        break;    }    return (INT_PTR)FALSE;}

注意截图部分的用法
这里写图片描述,使用完之后一定要释放
结果图片正确显示
这里写图片描述
OK

原创粉丝点击