Konvertierung von 'cli::interior_ptr<Type>' in 'LPDWORD'



  • Hey,

    also das Problem ist folgendes... Habe mich nun an ein neues Thema gewagt.

    Allerdings will das alles nich wie ich will... In der Konsole funktioniert das wunderbar!

    Aber in Winforms kommt immer dieser hässliche Fehler...

    Hier erstmal der Code:

    DWORD procID;
    HANDLE hProc;
    
    GetWindowThreadProcessId(hWnd,&procID);
    
    hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);
    

    error C2664: 'GetWindowThreadProcessId': Konvertierung des Parameters 2 von 'cli::interior_ptr<Type>' in 'LPDWORD' nicht möglich

    Sooo was bitte ist da falsch? Wie gesagt in der Konsole funktioniert das 😛

    ... Danke schonmal und FROHES NEUES 😃



  • Kann es sein, dass der gezeigte Code nicht der Code ist, der den Fehler erzeugt?
    Denn bei mir funktioniert das tadellos.

    Falls procID jedoch eine Member Variable ist, wird der entsprechende Fehler angezeigt.

    ➡

    Das Problem hierbei ist, dass der Member eines managed Types automatisch auch managed wird. Du würdest also versuchen, die Adresse eines managed Objekts einer Funktion zu übergeben. Das Problem ist m.A. nach, dass die Adresse ändern kann (weil der GC es verschieben kann).

    Abhilfe schafft das pin_ptr<T> Template:
    (http://msdn.microsoft.com/en-us/library/1dz8byfh(VS.80).aspx)

    ref class Test
    {
    public:
        void func(HWND hWnd)
        {
            pin_ptr<DWORD> pProcID = &_procID;
            GetWindowThreadProcessId(hWnd, pProcID);
            // ...
        }
    
    private:
        DWORD _procID;
    };
    

    Simon



  • Thx :xmas1:
    Vor ein paar Minuten bin ich auch auf den Fehler gestoßen :p... Dachte man kann sich bei Winforms ganz einfach Globale Variablen machen :p...

    Danke 😃



  • Naja... man kann es auch übertreiben... dafür würde ich nicht pinnen...
    Dann schon eher eine lokale Variable "opfern"... damit spart man sich das pinnen...


Anmelden zum Antworten