Window Handle



  • Hilfe!
    Ich habe eine ActiveX Komponente eingebunden und
    die möchte für eine Funktion ein WindowHandle.
    Das soll angeblich "long" sein.

    Habe versucht this->Handle zu übergeben. Dann
    meckert der Compiler wegen void* und long.
    Wenn ich mit (long) caste, dann wird zwar das
    Programm übersetetzt, ich bekomme aber beim
    Aufruf eine Fehlermeldung.

    Hat jemand eine Idee?

    Chris

    HWND myhwnd;
    myhwnd = (long) this->Handle;

    DDialCtl1->Dial( myhwnd , (wchar_t*) "275",(wchar_t*) "test");



  • Hi,

    was sagt denn der Hersteller der ActiveX dazu?

    //Edit: und vor allem wie sieht die Fehlermeldung aus?

    mfg, Micha!



  • Den Hersteller gibt es leider nicht mehr.
    Das ActiveX funktioniert unter VB einwandfrei.

    Ich habe wenig Erfahrungen mit ActiveX unter BCB.
    Hat auch gedaueert, bis ich das compilieren konnte,
    er hatte beim Konvertieren der dll eine Variable
    ins Kommentarfeld reingezogen und dann hat der
    Compiler dauernd gemeckert.

    Der Fehler ist irgendwas mit "Internal Error", also
    auch leider nicht sehr aufschlussreich...



  • Hallo

    Das ActiveX funktioniert unter VB einwandfrei.

    Dann zeig doch mal den relevanten Ausschnitt aus dem VB-Quellcode, was für ein Handle wie dort übergeben wird.
    Denn es kommt mir komisch vor, das ein Windows-Fenster-Handle als long übergeben werden soll, und dann noch an eine nichtvisuelle (?) Komunikationskomponente.
    Sollte wirklich der Windows-Handle des aktuellen Fensters als long übergeben werden, machst du jedenfalls mit deinem Cast nichts falsch.

    Statt dem hier (wchar_t) "275"* solltest du aber besser das hier L"275" schreiben.

    bis bald
    akari



  • Hallo,
    danke für die Antworten.
    Nochmal zur Erklärung. Es handelt sich um eine Komponente,
    mit der man TAPI-Anrufe machen kann, dh. man kann über ein
    angeschlossenes Telefon wählen.

    Unter VB wird die Funktion folgendermassen aufgerufen:

    Private Sub Command1_Click()
       DDialCtl1.Dial Form1.hWnd, "275", "name"
    End Sub
    

    nichtvisuell:
    Doch, es erscheint ja ein Fenster. Dort wird dann angezeigt,
    welche Nummer angerufen wird und es ist ein Button zum
    Auglegen vorhanden.
    Ich dachte Window-Handels wären immer eine Long Zahl?

    Bei der Übernahme, des ActiveX hat BCB die folgende
    Funktion draus gemacht:

    // OCX-Methoden
      void  __fastcall Dial(long hWnd, BSTR DialNumber, BSTR DialName);
    

    Danke
    Chris



  • Ich habs!

    Hallo akari,
    der Tipp mit dem "L" war wohl die Lösung.

    DDialCtl1->Dial( (long) this->Handle , L"275",L"name");
    

    Das funktioniert!
    Was macht das "L"?



  • Hallo

    Das L macht aus dem folgenden AnsiString-Literal ein Unicode-Literal, weil du für die Funktion ein wchar_t* brauchst.

    bis bald
    akari



  • Hallo akari,

    ich bin es nochmal.
    Jetzt habe ich folgendes Problem. Ich habe
    die Nummer nicht mehr in der Konstanten ("123")
    sondern in einer Variablen stehen (z.B. AnsiString).

    Wie kann ich das jetzt mit "L" umwandeln?

    Wenn ich schreibe:

    AnsiString test;
     test = "275";
     DDialCtl1->Dial( (long) this->Handle , (L) test, L"cpr");
    

    dann gibt es einen Compilerfehler, dass "L"
    ein undefiniertes Symbol ist.

    Hat jemand eine Lösung?

    Definiert ist die Funktion mit BSTR

    void __fastcall TDDialCtl::Dial(long hWnd, BSTR DialNumber, BSTR DialName)
    {
      GetDefaultInterface()->Dial(hWnd, DialNumber, DialName);
    }
    

    Beste Grüsse
    Chris



  • Hallo

    Da du kein Literal mehr hast kannst du auch kein "L" mehr benutzen. Du must mit der WideString-Klasse konvertieren

    AnsiString test = "275";
    DDialCtl1->Dial( (long) this->Handle , WideString(test).c_bstr(), L"cpr");
    

    bis bald
    akari



  • Danke!


Anmelden zum Antworten