Exe ile DLL haberleşmesi nasıl yapılır?

MyRose

Centipat
Katılım
9 Kasım 2021
Mesajlar
51
Çözümler
1
Merhaba arkadaşlar,

Ben bir C++/clr ile Windows form oluşturucağım ve ekstra bir DLL'im olacak fakat bu DLL benim hedef programıma enjekte olacak ve windowsform exe ile bu hedef programdaki DLL'in haberleşmesini istiyorum. Bunu nasıl yaparım?
 
Interprocess Communication'a gerek olduğunu düşünmüyorum. Win32 API'sindeki LoadLibrary() fonksiyonu ile DLL'yi yükleyerek GetProcAddress() fonksiyonuyla da aradığın fonksiyonun olup olmadığını bulabilirsin. Tabii ki "calling convension" dediğimiz hedenin de burada önemi mevcut; GetProcAddress() fonksiyonunun DLL'deki o fonksiyonu bulabilmesi için fonksiyonun "export" edimiş olması lazım.

[CODE lang="cpp" title="Uygulama"]#include <windows.h>
#include <iostream>

/*
Bu tanım, int_fptr'nin int türünden değer döndüren ve hiçbir argüman almayan
fonksiyona işaretçi olduğunu tanımlıyor.
*/
typedef int (__stdcall *int_fptr)();

int main()
{
HINSTANCE dll_instance = LoadLibrary("test.dll");

if (!dll_instance) {
std::cout << "Gerekli olan kutuphane bulunamadi." << std::endl;
return EXIT_FAILURE;
}

// fonksiyon adresinin çözümü
int_fptr function = (int_fptr)GetProcAddress(hGetProcIDDLL, "test_function");
if (!function) {
std::cout << "Kutuphanede aranilan fonksiyon bulunamadi." << std::endl;
return EXIT_FAILURE;
}

std::cout << "Fonksiyon donus degeri: " << function() << std::endl;

return EXIT_SUCCESS;
}[/CODE]

[CODE lang="cpp" title="Örnek DLL fonksiyonu giriş kodu"]int __stdcall __declspec(dllexport) test_function(){
//kod
}[/CODE]
 
Interprocess Communication'a gerek olduğunu düşünmüyorum. Win32 API'sindeki LoadLibrary() fonksiyonu ile DLL'yi yükleyerek GetProcAddress() fonksiyonuyla da aradığın fonksiyonun olup olmadığını bulabilirsin. Tabii ki "calling convension" dediğimiz hedenin de burada önemi mevcut; GetProcAddress() fonksiyonunun DLL'deki o fonksiyonu bulabilmesi için fonksiyonun "export" edimiş olması lazım.

[CODE lang="cpp" title="Uygulama"]#include <windows.h>
#include <iostream>

/*
Bu tanım, int_fptr'nin int türünden değer döndüren ve hiçbir argüman almayan
fonksiyona işaretçi olduğunu tanımlıyor.
*/
typedef int (__stdcall *int_fptr)();

int main()
{
HINSTANCE dll_instance = LoadLibrary("test.dll");

if (!dll_instance) {
std::cout << "Gerekli olan kutuphane bulunamadi." << std::endl;
return EXIT_FAILURE;
}

// fonksiyon adresinin çözümü
int_fptr function = (int_fptr)GetProcAddress(hGetProcIDDLL, "test_function");
if (!function) {
std::cout << "Kutuphanede aranilan fonksiyon bulunamadi." << std::endl;
return EXIT_FAILURE;
}

std::cout << "Fonksiyon donus degeri: " << function() << std::endl;

return EXIT_SUCCESS;
}[/CODE]

[CODE lang="cpp" title="Örnek DLL fonksiyonu giriş kodu"]int __stdcall __declspec(dllexport) test_function(){
//kod
}[/CODE]
DLL yüklemesi bir isine yaramaz ki, adam uzak process'e inject etmiş zaten dll yi, ben bunu yaptığım winform uygulamasıyla uzaktan kontrol etmek istiyorum diyor, sen standart dll yuklemesini anlatmışsın.
 
Önemli değil, yalnız arkadas imgui falan kullansa bu kadar acı cekmeyecekti. Neyse ugrassın bakalım yeni seyler ögrenir fena olmaz...
IMGui'den de ziyade Qt ya da wxWidgets kullansa, hatta FLTK kullansa şu ankine göre çok daha az uğraşırdı diye düşünüyorum. CLR ile Windows Forms uygulaması yapmak çok uğraştırıcı bir olay. Bilgi edinmek ise amaç güzel bir şey tabi.
 
IMGui'den de ziyade Qt ya da wxWidgets kullansa, hatta FLTK kullansa şu ankine göre çok daha az uğraşırdı diye düşünüyorum. CLR ile Windows Forms uygulaması yapmak çok uğraştırıcı bir olay. Bilgi edinmek ise amaç güzel bir şey tabi.
Önemli değil, yalnız arkadas imgui falan kullansa bu kadar acı cekmeyecekti. Neyse ugrassın bakalım yeni seyler ögrenir fena olmaz...
Qt c++ ile UI içeren programı dll olarak derleyebilir miyim? Derleyebilirsem native dll mi olur?
 
Qt c++ ile UI içeren programı dll olarak derleyebilir miyim? Derleyebilirsem native dll mi olur?
Bu native olayına bir açıklık getireyim, sen herhangi bir şekilde C# ya da .NET kullanırsan buna wrapped class'lar da dahil, derlediğin kodda MSIL (ara dil ya da byte kodu) içerir. Biz burada native derken saf makine kodundan bahsediyoruz, byte code içermeyecek, yani CLR'ye ihtiyaç duymayacak.

Soruna gelirsek QT ile native kod elde edersin, aslında DLL içinde windows apilerini doğrudan çağırarak ya da MFC'yi kullanarak da rahatlıkla bir windows form app yapabilirsin. Ancak sanıyorum ki sana bunlar karmaşık geliyor, arayüz tasarlamak için kolay bir uygulama istiyorsun.

Olmazsa sen projeni komple yükle linkini bırak buraya, boş vaktimde ilgileneyim.
 

Geri
Yukarı