Winapi

06.04.2024

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

Yazar: Admin

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:

Detaylar

Mysql

02.02.2024

Kayıt silme işlemlerinden sonra, tablo kayıt düzenleme ve AUTO_INCREMENT değerini ayarlama

Yazar: Admin

Bir tabloda yapılan kayıt silme işlemlerinden sonra, arada oluşan boşlukları aradan kaldırmak ve düzenlemek amacıyla, AUTO_INCREMENT değeri içeren sütundaki değerleri 1'den itibaren yeniden sıralama ve AUTO_INCREMENT değerini en son satır değerinden bir sonraki değere ayarlama işlemlerini aşağıdaki komutları kullanarak gerçekleştirebiliriz:


SET @count = 0;
UPDATE table_name SET table_name.id = @count:= @count + 1;

ALTER TABLE table_name AUTO_INCREMENT = 1

ALTER TABLE table_name AUTO_INCREMENT = 1 komutu tablonun AUTO_INCREMENT değerini, 1 sayısına değil, otomatik artan değerleri içeren sütunda yer alan maksimum değerin bir fazlasına ayarlar.

Detaylar

Php

01.02.2024

Mysql veri tabanına kayıtlı web sayfa içeriklerine yol tanımlaması ekleme

Yazar: Admin

Bir veritabanına kaydedilen web sayfa içeriklerindeki belirli dosyalara ait yol tanımlamalarını, proje web sayfalarında kullanabilmek için, veriyi veritabanından okuttuktan sonra, str_replace() fonksiyonu ile verideki yol tanımlarının başına proje ana dizinini ekleyebiliriz.

Aşağıdaki örnekte, public/images/ dizisi içinde bulunan image1.png adlı bir resim dosyası tanımlanarak oluşturulan bir sayfa içeriği okunduktan sonra ROOT değeri tüm image yol tanımlamalarının başına eklendikten sonra işlem yapılmaktadır.


$rDir = '/mysite/'; // Yerel sunucuda proje dizin adı
define('ROOT', ($_SERVER['SERVER_NAME']==='localhost') ? $rDir : '/'); // Yerel sunucu ise ROOT değeri '/mysite/' değilse '/'

$icerik = 'public/images/image1.png'; // İçerik okuma işlemi 

$icerik = str_replace('src="public/images', 'src="' . ROOT . 'public/images/image1.png', $icerik);

echo $icerik;

Detaylar

Mysql

31.01.2024

Bir tablonun bir sütunundaki değerleri başka bir tablo sütunundan güncelleme

Yazar: Admin

Bir tablonun bir sütunundaki satır değerlerini başka bir tablo sütunundan belirli bir sütunun eşleşmesine göre güncellemek için 2 farklı yöntem kullanabiliriz:

UPDATE TableB
INNER JOIN TableA ON TableA.columnT = TableB.ColumnV
SET TableB.columnY = TableA.columnZ

UPDATE TableB 
SET TableB. columnY = (
   SELECT TableA. columnZ 
   FROM TableA
   WHERE TableA.columnT = TableB.ColumnV
)

Detaylar

Php

02.01.2024

Fatal error: Uncaught TypeError: strpos() hatası

Yazar: Admin

PHP kodları ile ilgili olarak aşağıdakine benzer bir hata mesajı alıyorsanız:

Fatal error: Uncaught TypeError: strpos(): Argument #1 ($haystack) must be of type string, array given

Bu sorunu çözmek için, strpos() fonksiyonu yerine in_array() fonksiyonunu kullanabilirsiniz:


strpos(string,find,start)
  
in_array(search, array, type)

Detaylar

WampServer

01.01.2024

Wampserver'da ön tanımlı depolama motorunu değiştirme

Yazar: Admin

Bilgisayarımızda kurulu Wampserver programının ön tanımlı depolama motorunu değiştirmek için, mysql dizinindeki my.ini dosyasındaki default_storage_engine değerini InnoDB olarak belirlemek yeterli olacaktır.

Wampserver 3.0.0 programının C sürücüsünde kurulu olduğunu kabul edersek, my.ini dosyasının içinde bulunduğu mysql dizininin yol tanımlaması aşağıdaki şekilde olacaktır:

C:\\wamp\\bin\\mysql\\mysql8.0.31

Ön tanımlı depolama motorunu MyISAM yerine InnoDB olarak değiştirmek için, bu dizindeki my.ini dosyasındaki default_storage_engine satırı aşağıdaki şekilde olacaktır:

default_storage_engine=InnoDB

Wampserver programını kapatıp tekrar açtığımızda, ön tanımlı depolama motoru InnoDB olacaktır.

Detaylar

Php

13.11.2023

PHPMailer "SMTP Error: Could not connect to SMTP host. Connection failed" hatası

Yazar: Admin

PHPMailer kütüphanesini kullanarak e-posta gönderirken,

SMTP Error: Could not connect to SMTP host. Connection failed. stream_socket_enable_crypto()

şeklinde bir hata mesajı aldığımızda, aşağıda gösterilen yöntemle, SMTPOptions değerini ekleyerek, bu sorunu çözebiliriz:


use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$mail = new PHPMailer();

$mail->SMTPOptions = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);

$mail->isSMTP();                             
$mail->Host       = 'xxxx.xxxxxxxxxxxxxxxx.com'; // E-posta sunucu adresi
$mail->SMTPAuth   = true;  
$mail->CharSet    = 'UTF-8';                  
$mail->Username   = 'xxxxxx@xxxxxxxxxxxxx.com'; // E-posta sunucu kullanıcı adı
$mail->Password   = 'parola'; // E-posta sunucu parolası
$mail->Port       = 587; // Sunucu port adresi farklılık gösterebilir.

$mail->setFrom('xxxxxx@xxxxxxxxxxxxx.com', 'Gönderen'); // Gönderen
$mail->addAddress('xxxxxx@xxxxxxx.com'); // Alıcı

$mail->isHTML(true);
$mail->Subject = 'E-posta konu başlığı';
$mail->Body    = 'E-posta içeriği';

if (!$mail->send()) {
    echo 'E-posta gönderme hatası: ' . $mail->ErrorInfo;
} 
else {
    echo 'Mesaj gönderildi!';
}

Detaylar

Borsa

07.06.2023

Borsa Youtube kanalımız ve Twitter hesabımız 08 Haziran 2023 tarihinden itibaren yayında...

Yazar: Admin

8 Haziran 2023 tarihinden itibaren borsa ile ilgili yaptığımız çalışmaları paylaşmak amacıyla oluşturduğumuz Borsa Youtube kanalımız ve Twitter hesabımız yayına başlayacaktır.

Her yatırımcının başlangıçtan itibaren ihtiyaç duyacağı kullanım ve programlama alanlarındaki temel ve ileri seviye bilgileri uygulamalı olarak verilecektir.

Twitter hesabımız üzerinden,

  1. BIST'in açık olduğu her gün, seans açılışı öncesinde, BIST 100 kapanış değeri ile ons altın, gram altın, dolar, euro, ham petrolün anlık değerleri,
  2. ABD, başlıca Avrupa ve uzak doğu ülkelerinin borsa değerleri,
  3. Yaptığımız bazı değerlendirmeler ile detaylı çalışmalarımızın özetleri paylaşılacaktır.

Youtube kanalımızda aşağıda belirtilen konularda içerik sunulacaktır:

  1. Borsanın temel kuralları
  2. Temel ve teknik analiz çalışmalarımız
  3. Hisse değerleme yöntemleri
  4. Bilanço ve gelir tablosu esasları
  5. KAP (Kamu Aydınlatma Platformu) kullanımı
  6. Borsada uygulanacak alım satım yöntemleri
  7. İstikrarlı kazanç yöntemleri

Ayrıca her iki hesap üzerinden ortak içerik sunulacaktır:

  1. Borsa takibinde kullanılan platformlarla ilgili bilgiler (tradingview.com, investing.com, ... )
  2. Faydalı aracı kurum kaynakları
  3. İndikatör anlatımları ve uygulamaları
  4. Strateji anlatımları ve uygulamaları ile backtest işlemleri
  5. Çoklu hisse takibi

Detaylar