Visual C++ und Cluster-Api



  • Hallo,

    ich habe ein Problem mit Visual C++ und der Cluster API. Ich habe eine Funktion der Cluster Api (ich schreibe es allgemein, da das Problem an mehreren Stellen auftritt), welche grob so aussieht:

    clusterfunc(..., LPWSTR lpszString, LPDWORD lpcchSize, ...)
    

    Üblicherweise nutze ich solche Funktionen wie folgt:

    DWORD dwretval = 0;
    CString cMyString;
    DWORD dwSize = 0;
    ...
    while ((dwretval = clusterfunc(..., cMyString.GetBuffer(dwSize), &dwSize, ...) == ERROR_MORE_DATA))
    {
      cMyString.ReleaseBuffer();
      dwSize++;
    }
    

    Das funtioniert auch wunderbar.

    Jetzt habe ich aber das Problem, dass ich eine Funktion (sagen wir mal func1 ) zwischen schalten muss. D.h. Ich habe eine Funktion ( func1 ), welche einen Rückgabewert (Fehlercode) besitzt und clusterfunc aufrufen soll. Diese wird dann von func2 aufgerufen.

    Also grob

    DWORD func1(...)
    {
      /* Behandlung ggf. auch per while*/
      clusterfunc(...);
    }
    
    void func2(...)
    {
      DWORD dwErrorcode = 0;
    
      dwErrorcode = func1(...);
    }
    

    func2 benötigt dabei den von clusterfunc zurück gegebenen String. Wie gebe ich den jetzt am Besten zurück? In func2 ist ja die Größe des benötigten Buffers nicht bekannt, wenn ich einen Buffer an func1 übergebe und den anpasse, stimmt aber die Adresse ggf. nicht mehr.

    Ein CString Objekt lässt sich auch nicht so einfach per call-by-reference übergeben, soweit ich weiß.

    Kann mir jemand helfen, wie ich dieses Problem effizient löse? Mir würde als Lösung nur einfallen, einen LPWSTR an func2 zu übergeben und denn über Speicherallokation und Freigabe anzupassen. Dann müsste zusätzlich noch ein Pointer auf eine Variable, welche den Wert empfängt, übergeben werden.

    Gibt es eine bessere Möglichkeit?

    Gruß,
    Chinook


Anmelden zum Antworten