Konvertierung von IntPtr (HWND) auf HANDLE



  • Hi,

    does anyone know how I can convert a IntPtr of a HWND object to the data type HANDLE ??

    I want to register the window Form1 to receive PnP Messages from a USB API from cypress:

    USBDevice = new CCyUSBDevice(Form1->Handle);
    

    CCyUSBDevice expects HANDLE, but I get only IntPtr from my Form1....

    Please help me!

    maggi01



  • look for: EnumWindow()

    Maybe this function can help you!!



  • USBDevice = new CCyUSBDevice((HWND) Form1->Handle);
    


  • @Jochen Kalmbach: ich möchte nicht auf (HWND) casten, sondern auf (HANDLE)... aber mit einem einfachen cast-Befehl ist das nicht zu machen!

    @BorisDieKlinge: Was kann ich mit EnumWindows() machen? Wie benutze ich diese Funktion?



  • maggi01 schrieb:

    Was kann ich mit EnumWindows() machen? Wie benutze ich diese Funktion?

    Tu peut regarder au MSDN ou dans l'aid..



  • maggi01 schrieb:

    @Jochen Kalmbach: ich möchte nicht auf (HWND) casten, sondern auf (HANDLE)... aber mit einem einfachen cast-Befehl ist das nicht zu machen!

    Was soll denn HANDLE sein? Bzw. was wird denn Erwartet? Das from1->Handle ist auf jeden Fall ein HWND und kein HANDLE...



  • CCyUSBDevice(HANDLE hnd)
    

    hnd is a handle to the application's main window (the window whose WndProc function will process USB PnP events).

    Das steht in der Hilfe zu der CyAPI von Cypress drin.
    Meine erste Idee war nun einfach mit Form1::Handle den Handle meines Hauptfensters an die API zu übergeben...

    Ich habe auch schon alle möglichen Casts versucht:
    (HWND) Form1::Handle
    (HANDLE) Form1::Handle
    static_cast <HANDLE> Form1::Handle

    ...leider erfolglos.

    Ich habe nun herausgefunden, dass Form1::Handle eigentlich vom Typ "IntPtr" ist. Wie kann ich denn nun auf den Inhalt zugreifen!?

    Sorry für die blöden Fragen, aber ich bin nun mal ein Beginner im Bereich der Visual C++ Programmierung. 😃



  • @Mods: => C++/CLI

    Dein Hauptprolem ist, dass "Form1::Handle" kein gültiger Code ist!
    Du brauchst eine Instanz für den Zugriff auf das Handle!

    form1->Handle
    


  • Danke für den Tipp - leider kam es auch hier zu einer Fehlermeldung:

    *USBDevice = new CCyUSBDevice(Form1->Handle);
    

    Verursacht: errorC2232: '->System::Windows::Control::Handle': left operand has 'class' type, use '.'

    Das habe ich dann auch befolgt:

    *USBDevice = new CCyUSBDevice(Form1.Handle);
    

    Führt zu:
    warning C4832: token '.' is illegal after UDT 'App1::Form1'
    error C2275: 'App1::Form1': illegal use of this type as an expression

    Damit kann ich nun wieder nichts anfangen...

    Vielleicht noch ein par Details zu meinem Code:

    Von "Microsoft Visual C++" wurde folgender Rahmen automatisch erzeugt:

    #pragma once
    
    namespace App1
    {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::IO;
    
    public __gc class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		[b]static CCyUSBDevice *USBDevice;[/b]		
    		Form1(void)
    		{
    			InitializeComponent();
    		}
    .
    .
    .
    

    Beim Start meines Form1 initialisiere ich dann USBDevice:

    private: System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
    {
    	*USBDevice = new CCyUSBDevice(Form1->Handle);
    
    .
    .
    .
    


  • Jochen Kalmbach schrieb:

    @Mods: => C++/CLI

    Oh, okay. 🙂



  • Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Verwende bitte

    USBDevice = new CCyUSBDevice((HANDLE) this->Handle);
    


  • Danke für den Tipp, ich kann mein Projekt nun fehlerfrei kompilieren.

    Leider kommt es bei der Ausführung der Applikation zu folgendem Fehler:

    "Object reference not set to an instance of an object."

    -> Was zum Teufel soll das nun bedeuten ?

    -> Wenn ich die Klammer hinter CCyUSBDevice**()** leer lasse bekomme ich den Fehler nicht...



  • Du musst schon die Stelle anschauen, wo der Fehler auftritt... oder hier die entsprechenden Codezeilen posten...



  • Der Fehler tritt exakt bei dieser Zeile auf:

    USBDevice = new CCyUSBDevice((HANDLE) this->Handle);
    


  • this->Handle wird leer bzw. nicht gesetzt sein.

    Tip: Splitte die Zeile mal auf:

    USBDevice = new CCyUSBDevice(
            (HANDLE) 
           this->Handle);
    

    und schau wo der Debugger hängen bleibt.

    Btw.: Wieso die hässlichen C Casts ?



  • Was für Alternativen habe ich denn um die "hässlichen C-Casts" zu umgehen?

    Der Debugger bleibt bei der mittleren Zeile hängen - also bei der Ausführung von this->Handle

    Die exception ist übrigens: "System.NullReferenceException"

    Ich habe mir mal "this->Handle" im Debugger angeschaut: dort erhalte ich an oben erwähnter Stelle den Wert 0x704dc (__int32), also definitiv einen Wert, der nicht Null ist! 😞



  • maggi01 schrieb:

    Was für Alternativen habe ich denn um die "hässlichen C-Casts" zu umgehen?

    static_cast, Konstruktoren und ... reinterpret_cast.



  • Schau Dir in diesem Handle mal den Value Wert an.

    Kurz: Handle ist nicht gesetzt zu der Zeit in der Du es benutzen willst.



  • Bei diesen beiden Varianten wird eine Konvertierung von IntPtr zu HANDLE nicht erlaubt:

    reinterpret_cast <HANDLE> (this->Handle);
    __try_cast <HANDLE> (this->Handle);
    

    Nur mit dem static_cast lässt sich der Code kompilieren, allerdings löst die Applikation die gleichen Exception, wie oben beschrieben aus...

    ...dat war wohl nix...

    Hat noch jemand Vorschläge !?


Anmelden zum Antworten