2011-01-12 18 views
2

Okay, ich kann das ernsthaft nicht herausfinden.boost :: asio :: io_service wirft Ausnahme

Ich habe ein DLL-Projekt in MSVC, das versucht, Asio (von Boost 1.45.0) zu verwenden, aber jedes Mal, wenn ich meinen io_service erstelle, wird eine Ausnahme ausgelöst. Hier ist, was ich zu Testzwecken tue:

void run() 
{ 
    boost::this_thread::sleep(boost::posix_time::seconds(5)); 
    try 
    { 
     boost::asio::io_service io_service; 
    } 
    catch (std::exception & e) 
    { 
     MessageBox(NULL, e.what(), "Exception", MB_OK); 
    } 
} 

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
{ 
    if (fdwReason == DLL_PROCESS_ATTACH) 
    { 
     boost::thread thread(run); 
    } 
    return TRUE; 
} 

Dies ist, was das Meldungsfeld zeigt:

winsock: WSAStartup kann zu diesem Zeitpunkt nicht funktionieren, weil das zugrundeliegende System verwendet es Netzwerkdienste zur Verfügung zu stellen derzeit nicht verfügbar

Hier ist, was MSDN sagt über sie (Fehlercode 10091, WSASYSNOTREADY):

Das Netzwerk-Subsystem ist nicht verfügbar. Dieser Fehler wird von WSAStartup zurückgegeben, wenn die Windows Sockets-Implementierung nicht funktionieren kann, da das zugrunde liegende System, das zum Bereitstellen von Netzwerkdiensten verwendet wird, derzeit nicht verfügbar ist. Benutzer sollten überprüfen: dass sich die entsprechende Windows Sockets DLL-Datei in dem aktuellen Pfad befindet. Dass sie nicht versuchen, mehr als eine Windows Sockets-Implementierung gleichzeitig zu verwenden. Wenn auf Ihrem System mehr als eine Winsock-DLL vorhanden ist, stellen Sie sicher, dass die erste im Pfad für das aktuell geladene Netzwerk-Subsystem geeignet ist. Die Windows Sockets-Implementierungsdokumentation, um sicherzustellen, dass alle erforderlichen Komponenten zur Zeit korrekt installiert und konfiguriert sind.

Doch nichts davon scheint für mich zu gelten (oder so denke ich).

Hier ist meine Befehlszeile:

/O2/GL/D "_WIN32_WINNT = 0x0501"/D "_WINDLL"/FD/EHsc/MD/Gy/Fo "Release \"/Fd "Release \ vc90.pdb "/ W3/WX/nologo/c/TP/fehlerbericht: prompt

Wenn jemand weiß, was falsch sein könnte, bitte hilf mir! Vielen Dank.

Antwort

1

Microsoft empfiehlt not to call WSAStartup from DllMain, so dass Ihre beste Wette wäre, einen IO-Thread an anderer Stelle zu erstellen.

Die WSAStartup-Funktion führt normalerweise dazu, dass protokollspezifische Helfer-DLLs geladen werden. Daher sollte die WSAStartup-Funktion nicht von der DllMain-Funktion in einer Anwendungs-DLL aufgerufen werden.

+0

Wo kann der Thread sonst noch erstellt werden? Das ist der einzige Einstiegspunkt, richtig? – DSB

+0

Was ist falsch beim Erstellen eines Threads (IO oder nicht) in DllMain? Was ist der Unterschied zwischen IO und anderen Threads in diesem Bereich? –

+0

Nun, ich habe es endlich behoben, indem ich einfach den io_service außerhalb dieser bestimmten DLL gestellt habe. Ob oder nicht, was Sie vorgeschlagen haben, war wirklich das Problem, es führte mich zur Lösung, also danke. – DSB