CodeBlocks IDE ile DLL dosyası oluşturma ve oluşturulan DLL dosyasını bir WinAPI projesinde kullanma

Yazar: Admin

Kategori: Yazılım

Bu yazımızda, CodeBlocks IDE kullanarak bir DLL dosyası oluşturmayı ve oluşturulan DLL dosyasını bir WinAPI projesinde kullanmayı göstermeye çalışacağız.

DLL proje oluşturma

1. Code::Blocks IDE'yi çalıştırdığınızda karşınıza gelen ekranda aşağıdaki resimde gösterilen File-New-Project menü seçeneğine tıklayın:

2. Karşınıza gelen pencereden Dynamic Link Library seçeneğini seçin ve "Go" butonuna tıklayın.

3. Karşınıza gelen pencerede "Next" butonuna tıklayarak devam edin:

4. Karşınıza gelen pencerede "Project title" bölümüne mydll yazdıktan sonra, "Next" butonuna tıklayarak devam edin:

5. Karşınıza gelen pencerede "Finish" butonuna tıklayarak DLL proje oluşturma işlemini tamamlayın:

6. Projede main.cpp ve main.h adlı iki adet dosya oluşturulacak ve ekran görüntüsü aşağıdakine benzer şekilde olacaktır:

7. Projedeki main.cpp dosyasına sağ tıklayın ve açılan menüden "Rename file..." seçeneğini seçin. Dosyanın adını main.c olarak değiştirdikten sonra "OK" butonuna tıklayın. main.h dosyasına sağ tıklayın ve açılan menüden "Rename file..." seçeneğini seçin. Dosyanın adını mydll.h olarak değiştirdikten sonra "OK" butonuna tıklayın.

8. Projedeki main.c ve mydll.h dosyalarının içeriğini aşağıda gösterildiği şekilde düzenleyin ve kaydedin:


#include "mydll.h"

// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}

extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}



#ifndef __MYDLL_H__
#define __MYDLL_H__

#include 

/*  To use this exported function of dll, include this header
 *  in your project.
 */

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

void DLL_EXPORT SomeFunction(const LPCSTR sometext);

#ifdef __cplusplus
}
#endif

#endif // __MYDLL_H__

8. Build - Build menü seçeneğine tıklayarak veya Ctrl-F9 tuşlarına basarak projeyi derleyin:

9. Proje derlendiğinde, aşağıdaki şekilde bir dizin ve dosya yapısı oluşacaktır:

Yukarıda altları kırmızı çizgili olarak gösterilen libmydll.a, mydll.dll, mydll.h dosyaları oluşturulacak WinAPI projesinde kullanılacaktır.

DLL dosyasını kullanacak WinAPI projesi oluşturma

1. Yeni bir WinAPI projesi oluşturmak için, File-New-Project menü seçeneğine tıklayın:

2. Karşınıza gelen pencereden Win32 GUI Project seçeneğini seçin ve "Go" butonuna tıklayın.

3. Karşınıza gelen pencerede "Next" butonuna tıklayarak devam edin:

4. Karşınıza gelen pencerede "Frame Based" seçeneğini seçtikten sonra, "Next" butonuna tıklayarak devam edin:

5. Karşınıza gelen pencerede "Project title" bölümüne myproj yazdıktan sonra, "Next" butonuna tıklayarak devam edin:

6. Karşınıza gelen pencerede "Finish" butonuna tıklayarak WinAPI proje oluşturma işlemini tamamlayın:

7. Projede main.cpp adlı bir adet dosya oluşturulacaktır. main.cpp dosyasına sağ tıklayın ve açılan menüden "Rename file..." seçeneğini seçin. Dosyanın adını main.c olarak değiştirdikten sonra "OK" butonuna tıklayın.

8. Build - Build menü seçeneğine tıklayarak veya Ctrl-F9 tuşlarına basarak projeyi derleyin:

9. Proje derlendiğinde, aşağıdaki şekilde bir dizin ve dosya yapısı oluşacaktır:

10. Project - Properties... menü seçeneğine tıklayarak veya Ctrl-F10 tuşlarına basarak projeyi çalıştırın:

11. Karşınıza gelen pencerenin "Build targets" sekmesinde Console application olan "Type" bölümünün değerini GUI application olarak değiştirip "OK" butonuna tıklayın:

12. Build - Run menü seçeneğine tıklayarak veya Ctrl-F10 tuşlarına basarak projeyi çalıştırın:

13. Proje ana penceresi karşınıza gelecektir:

DLL dosyasını kullanma işlemi

1. mydll.h ve libmydll.a dosyalarını myproj dizinine, mydll.dll dosyasını myproj\bin\Debug dizinine kopyalayın:

2. mydll.h dosyasını projeye eklemek için, Project - Add files... menü seçeneğine tıklayın. Açılan pencerede mydll.h dosyasını seçip "Aç" butonuna tıklayın. Karşınıza gelen pencerede "OK" butonuna tıklayın:

3. libmydll.a dosyasını projeye eklemek için:

  1. Project - Build options... menü seçeneğine tıklayın.
  2. Açılan pencerede "Add" butonuna tıklayın.
  3. Açılan pencerede dosya açma butonuna tıklayın.
  4. libmydll.a dosyasını seçtikten sonra "Aç" butonuna tıklayın.
  5. Açılan pencerede "Hayır" butonuna tıklayın.
  6. Karşınıza gelen pencerede "OK" butonuna tıklayın:
  7. Açılan pencerede "OK" butonuna tıklayın.

4. Projedeki main.c dosyasında, tıkladığımızda DLL foksiyonunu çağıran bir buton eklemek için, WM_CREATE altında bir adet buton oluşturulur. WM_COMMAND altında butona tıkladığınızda DLL fonksiyonunu çağıran kodlar eklenir. Proje main.c dosyasının içeriğini aşağıda gösterildiği şekilde düzenleyin ve kaydedin:


#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif

#define IDC_BUTTON 101

#include 
#include 
#include "mydll.h"

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");

HWND hwndButton;

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           _T("Code::Blocks Template Windows App"),       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
        {
             /* Buton oluşturma */
			 hwndButton = CreateWindowEx(0, "BUTTON", "Button1",
                 WS_CHILD | WS_VISIBLE | BS_NOTIFY, 40, 40, 120, 25,
                 hwnd, (HMENU) IDC_BUTTON, NULL, NULL);
        }
        break;

        case WM_COMMAND:
        {
             if(HIWORD(wParam) == BN_CLICKED) {
                if(LOWORD(wParam) == IDC_BUTTON) {
                   /* DLL fonksiyonunu çağırma */
				   SomeFunction("DLL ile gösterilen mesaj");
                }
             }
        }
        break;

        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

5. Build - Rebuild menü seçeneğine tıklayarak veya Ctrl-F11 tuşlarına basarak projeyi yeniden derleyin:

6. Build - Run menü seçeneğine tıklayarak veya Ctrl-F10 tuşlarına basarak projeyi çalıştırın:

7. Proje ana penceresi karşınıza gelecektir:

8. Butona tıkladığınızda, DLL fonksiyonu çağrılarak bir mesaj kutusu ekranda gösterilecektir: