DirectPlay Problem mit EnumHosts() (SDK Tutorial3)



  • Habe das gleiche Problem wie Sovok in
    http://www.c-plusplus.net/forum/viewtopic.php?t=21049

    meine frage basiert auf dem dritten tutorial (glaub ich)
    jedenfalls das tut in dem man einen client und einen host startet und mit dem >client versucht über enumhosts den host zu finden

    1. wenn ich mit dem client suche, ohne dass der host existiert bringt enumhosts >keinen fehler

    2. wenn ich erst nen server erstell, mein spiel nochmal starte und an der ip nach >nem host suche schlägt enumhosts fehl
    hresult beinhaltet aber in dem fall keinen der ca. 5 im sdk zu enumhosts >angegebenen fehler

    Mir gehts exact ganauso, habt Ihr damals eine Lösung gefunden ? Ich krieg echt noch die Motten wegen dem Teil, EnumHosts() gibt bei mir nur DPNERR_ALREADYINITIALIZED zurück, in der Dokumentation steht von so einem
    Rückgabewert überhaupt nichts. 😞
    Den gleichen Fehler kriege ich, wenn ich das Programm nur einmal starte, und im selben Fenster sowohl Host() als auch EnumHosts() aufrufe.
    Ist es möglich, das zwei Instanzen eines Programmes auf das gleiche DP8Peer-Objekt zugreifen, obwohl zweimal mit CoCreateInstance() erzeugt ?
    Ich habe so den Verdacht es könnte an sowas liegen.

    Danke schonmal für jede Hilfe,

    Biff



  • Vielleicht hilft Dir das:

    DXSDK schrieb:

    The first step in using the DirectPlay thread pool is to create and initialize an IDirectPlay8ThreadPool object. The IDirectPlay8ThreadPool object must be initialized before any other DirectPlay object or DirectPlay will create its own IDirectPlay8ThreadPool object when IDirectPlay8Peer is initialized. There can be only one IDirectPlay8ThreadPool object per process so if DirectPlay has created its own IDirectPlay8ThreadPool object then a subsequent call to IDirectPlay8ThreadPool::Initialize will return DPNERR_ALREADYINITIALIZED.

    😕
    Ansonsten wüsste ich auch nichts.
    Mal ein externes Tut probiert?



  • Danke für den Tipp, aber mit Threads hantiere ich noch gar nicht rum. Dennoch hab ich meinen Fehler gefunden. 🕶
    Scheinbar darf man bei EnumHosts() dem Parameter pdpaddrDeviceInfo keinen Port mitgeben. Da man ein entsprechendes IDirectPlay8Address Object sowohl für Host() als auch für EnumHosts() braucht biete es sich ja an, dieses in einer Create-Funktion zu erzeugen. Dabei muss man aber Unterscheiden, ob das Object für Host() oder EnumHosts() erszeugt werden soll:

    IDirectPlay8Address * dp8DeviceAddress=NULL;
    
    ...
    
    HRESULT CreateDeviceAddress(bool isHost)
    {
    HRESULT hr;
    if (dp8DeviceAddress)
    {    
    dp8DeviceAddress->Release();
    dp8DeviceAddress=NULL;
    }
    if(FAILED(hr=CoCreateInstance(CLSID_DirectPlay8Address, NULL, CLSCTX_INPROC_SERVER, IID_IDirectPlay8Address, (LPVOID*) &dp8DeviceAddress)))
      {
      MessageBox(0, L"Failed Creating the IDirectPlay8DeviceAddress Object", L"CreateDeviceAddress()", 0);      
      return hr;
      }    
    if(FAILED(hr=dp8DeviceAddress->SetSP(&CLSID_DP8SP_TCPIP )))
      {
      MessageBox(0, L"Failed Setting the SP for dp8DeviceAddress", L"CreateDeviceAddress()",0);
      return hr;
      }
    if(isHost)
      {
      if(FAILED(hr=dp8DeviceAddress->AddComponent(DPNA_KEY_PORT, &LocalPort, sizeof(DWORD), DPNA_DATATYPE_DWORD)))
        {
        MessageBox(0, L"Failed Setting the Port Numberfor dp8DeviceAdress", L"CreateDeviceAddress()", 0);
        return hr;   
        }
      }
    return S_OK;
    }
    

    Mann, was ein sch**ss Fehler,...

    Biff


Anmelden zum Antworten