wie int nach LPDWORD konvertieren



  • Ich habe einen integer (int value) den ich für einen DLL Aufruf nach
    LPDWORD konvertieren muss.
    Ich mache dazu folgendes:

    LPDWORD number = static_cast<LPDWORD>(&value);
    

    was mir aber nur den folgenden Fehler gibt:

    error: invalid static_cast from type 'int*' to type 'DWORD*'

    wie konvertiere ich nun richtig?



  • du willst anders als im Titel steht nicht ein int konvertieren, sondern einen Zeiger auf int. Das ist ein ziemlicher Unterschied.
    Du müsstest ein DWORD nehmen, den Wert des int hinenkopieren und den Zeiger auf das DWORD benutzen. Oder an Stelle des int gleich ein DWORD benutzen, das hängt davon ab wie du das alles verwenden willst.



  • Ich mache es jetzt so:

    DWORD number =  static_cast<DWORD>(value);
        LPDWORD pnumber = & number;
    ...
    ...
        value = static_cast<int>(*pnumber);
    

    sieht nur nicht schön aus.



  • Dann verwende doch gleich DWORD als Typ für value .



  • pospiech schrieb:

    sieht nur nicht schön aus.

    Stimmt. Aber was anderes bleibt dir nicht wenn du einen in/out-Parameter in einen anderen typen hin- und wieder zurück-konvertieren willst/musst...



  • krümelkacker schrieb:

    Dann verwende doch gleich DWORD als Typ für value .

    Die DLL verwendet ausschießlich Werte im WinAPI Stil.
    Der Rest des Projektes ist ausschießlich Qt, wo ein DWORD Typ unpassend ist.


  • Administrator

    Dann nimm eben einen unsigned long , ist nämlich das Gleiche wie ein DWORD.

    Grüssli



  • Dravere schrieb:

    Dann nimm eben einen unsigned long , ist nämlich das Gleiche wie ein DWORD.

    Grüssli

    Muss aber nicht das gleiche bleiben.
    Ich würde daher grundsätzlich davon ausgehen dass es zwei verschiedene Typen sind und die Hin- und Rückkonvertierung wie gehabt machen. Sich darauf festzulegen, dass DWORD immer unsigned sein muss, würde der Entkoppelung, die der DWORD-typedef bewirkt entgegenwirken.


  • Administrator

    pumuckl schrieb:

    Muss aber nicht das gleiche bleiben.
    Ich würde daher grundsätzlich davon ausgehen dass es zwei verschiedene Typen sind und die Hin- und Rückkonvertierung wie gehabt machen. Sich darauf festzulegen, dass DWORD immer unsigned sein muss, würde der Entkoppelung, die der DWORD-typedef bewirkt entgegenwirken.

    Ich persönlich würde ja einfach DWORD selber verwenden, aber da er sich so dagegen wehrt, würde ich doch eher meinen Vorschlag bevorzugen. Er verwendet schliesslich int und DWORD , da gibt es bereits eine mögliche Inkompatibilität. Falls sich DWORD tatsächlich ändert, könnte dies womöglich nicht mal auffallen wegen dem static_cast . Mit der Verwendung von unsigned long würde aber sofort ein Kompilerfehler beim Aufruf entstehen und man könnte auf die Änderung vernünftig reagieren.

    Grüssli



  • Nur zur Info: Die Zahl die abgefragt wird liegt sowieso nur zwischen 0 und 1024.



  • Dravere schrieb:

    Ich persönlich würde ja einfach DWORD selber verwenden

    Ich nicht. Wenn ein Framework irgendeinen eigenen Typ oder typedef einführt, benutze ich ihn genau an der Grenze zu diesem Framework und sonst nirgends. Andernfalls müsste ich den Header des Frameworks an Stellen einbinden wo er nichts zu suchen hat, nur um den typedef bekannt zu machen, oder aber selber typedeffen was bei Änderungen des originalen typedef erst recht zu Murks führt. Typen aus einer der Betriebssystem-APIs haben in der GUI nichts zu suchen. Stichwort Erweiterbarkeit und unnötige Abhängigkeiten vermeiden.


Log in to reply