2011-05-28 20 views
5

Böyle bir DllMain yazıyordu:Dllmain çağrılmıyor mu?

#include "main.h" 
#include "init.h" 
#include <iostream> 
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
{ 
//std::cout<<"hi\n"; //only for debug. did not shown. 
switch (fdwReason) 
{ 
    case DLL_PROCESS_ATTACH: 
     // attach to process 
     // return FALSE to fail DLL load 
     //std::cout<<"hello\n"; //only for debug. did not shown. 
     init(); //did not run :(
     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 
} 

ama bir test programından sonra LoadLibrary kullandığı(), hiçbir şey olmadı, hiçbir Merhaba veya ekranda selam. Sorunu çözmek ister misiniz? Çok teşekkürler!

P.S. DllMain not being called sorusunu izledim, ancak yine de yardımcı olmuyor.

PS2: Arayan programı

int main() 
{ 
cout<<"This is a test program to test.\n"; 
HINSTANCE hinstDLL; 
hinstDLL=LoadLibrary("ijl15.dll"); 
cout<<"Look like everything goes well.\n"; 
cout<<hinstDLL; 
return 0; 
} 

gibi çalıştırdığı çıkışları ise:

This is a test program to test. 
Look like everything goes well. 
0x6a980000 
Process returned 0 (0x0) execution time : 0.007 s 
Press any key to continue. 
+0

Hmm ... Tamam görünüyor ... LoadLibrary() kodu ekleyebilir misin? Ayrıca, sadece emin olmak için - konsol penceresinden çıktılar arıyorsunuz, sağa mı? – TCS

+0

Çalıştırıldığını init() görmeye istekliydim ama asla işe yaramaz bu yüzden biraz cout denedim ama hala işe yaramıyor – xxbidiao

+0

Tüm linker anahtarlarınız nedir? –

cevap

8

(sürü :() Ben Bu doğru işlev adını yapar ve nihayet DLLMain başarıyla denir

#define DLL_EXPORT extern "C" __declspec(dllexport) 

cevapsız bulundu. Neyse teşekkürler tüm!

+1

Sorunu nasıl çözer? Daha sonra kodda 'DLL_EXPORT' kullanılır? –

1

Ben kapalı konsol etkileşim kod şüpheleniyoruz. Bir pencere açma veya bir ses açma gibi ShellExecute() gibi biraz daha ince bir şey yapmayı deneyebilirsiniz.

+1

OutputDe bugString() bu tür şeyler için harika. – Ferruccio

+0

@Ferruccio init() dosyasına kayıt yazmak gibi başka şeyler de var, ama hiç çalışmadı ... Sonunda DLLMAIN başarısız oldu :(ama yine de teşekkürler! – xxbidiao

1

DLLMain'de neler yapabileceğiniz konusunda ciddi sınırlamalar vardır. özellikle, herhangi bir I/O yapmak normalde hayır değildir. Basit bir başlatma, main() 'ın bir yürütülebilir dosyada yaptığı gibi davranmamak için var.

+0

Aslında, merhaba ve merhaba sadece hata ayıklamak için ve init() çalışmadı. – xxbidiao

+0

@xxbidiao Tamam, init() ne yapar? –

+0

IO hakkında: emin misiniz? DllMain 'AFAIK güvenebileceğiniz tek şey kernel32.dll yüklendi ve Win32 IO işlevleri var. Açıkçası, CRT'nin ne yaptığından emin olamıyorsunuz, ancak doğrudan win32 IO ile güvende olmanız gerekir.Neyse, DllMain sadece küçük "dahili" başlatma için, ağır şeyler için kabul etti –

0

LoadLibrary gerçekten bir değeri döndürüyor (cout<<hinstDLL aramanız tarafından görüntülenen)?

Dll'iniz aynı dizinde mi yoksa PATH ortam değişkeni aracılığıyla mı kullanılabilir?

Farklı yerlerdeki dll'inizin birden çok sürümü var mı (sürüm hata ayıklama)? Bazı denemeden sonra

+0

Test programı şu sonuçları verir: Bu test edilecek bir test programıdır. Her şeyin yolunda gittiğine benziyor. 0x6a980000 İşlem döndürüldü 0 (0x0) yürütme süresi: 0.007 s Devam etmek için herhangi bir tuşa basın. ... Bunun gibi bir şey – xxbidiao

İlgili konular