ObjCreate Error bei BSTR* übergabe

  • Hallo lieber Leser !
    Ich versuche gerade ein OLE/COM-Object via Autoit anzusprechen.

    das erstellen des Handle mit

    [autoit]

    $ls = ObjCreate("Label32")

    [/autoit]

    funktioniert.

    so bekomme ich bei der Funktion

    [autoit]

    $bError = $ls.ShowWindow(1)

    [/autoit]

    die in der Documentation beschriebene Reaktion.

    D.h. soweit keine Fehler. :thumbup:

    Wenn ich aber eine Funktion aufrufen will, welche einen Pointer auf einen String verlangt ( in VB.Net [ BSTR* ] )
    Raucht mir die ganze Schose ab.

    zb.

    [autoit]

    ;Versions nummer ?!?
    $szLabel = ''
    $bError = $ls.GetVersion($szLabel)
    MsgBox(0, @ScriptName, $szLabel & " = $ls.GetVersion($szLabel)")

    [/autoit]

    In der Doku wird die Funktion in VB.Net mit
    Dim SVersion as String = ""
    iResult = oLSP.GetVersion(sVersion)
    ' sVersion enhält den Versionsstring


    ich bekomme aber lediglich die Fehlermeldung

    [autoit]

    ==> The requested action with this object has failed.:
    $bError = $ls.GetVersion($szLabel)
    $bError = $ls.GetVersion($szLabel)^ ERROR

    [/autoit]

    Hab schon eine ganze Weile gesucht und nur das AutoItObject.UDF gefunden wo da anscheinend helfen soll.... aber damit bin ich TOTAL überfordert !!! ?(

    hat jemand n Tip ?

  • Hi funkey !

    Ja .. hab ich probiert gehabt .. ohne Erfolg .. war ja fast klar ...

    [autoit]


    ==> The requested action with this object has failed.:
    $bError = $ls.GetVersion()
    $bError = $ls.GetVersion()^ ERROR

    [/autoit]

    kann man da vielleicht was mit "ObjCreateInterface" was machen ?

  • Bau mal einen COM error handler ein. Der gibt dann mehr Info über den Fehler.
    Wie so ein Handler aufgebaut ist, siehst Du in der Hilfe unter ObjEvent.

  • Hi water !
    Das mit dem ErrorHandler hatte ich total überlesen ! ist ja Praktisch ;)

    aber der Fehler ist immer noch da :
    Meldung

    [autoit]


    --> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop
    err.number is: -2147352571
    err.windescription: Typkonflikt.

    [/autoit][autoit][/autoit][autoit]

    err.description is:
    err.source is:
    err.helpfile is:
    err.helpcontext is: 0
    err.lastdllerror is: 0
    err.scriptline is: 49
    err.retcode is: 0

    [/autoit][autoit][/autoit][autoit]

    +>17:19:15 AutoIT3.exe ended.rc:0
    >Exit code: 0 Time: 16.947

    [/autoit]

    wie vermutet ein Typkonflikt.....
    ich glaube er mag meine "string" Variable nicht als Pointer akzeptieren.
    kann man das nicht irgend wie Casten ?

    z.b.

    [autoit]

    $bError = $ls.GetVersion(Ptr($String))

    [/autoit]
  • Dann musst Du aber mit DllStructCreate die Struktur mit dem String anlegen und dann mit DllStuctGetPtr den Pointer an die Funktion übergeben.

  • habe folgendes Versucht.

    [autoit]


    Local $aStruct = DllStructCreate("bstr* string")
    $bError = $ls.GetVersion(DllStructGetPtr($aStruct)

    [/autoit][autoit][/autoit][autoit]

    $szLabel = DllStructGetData($aStruct, 1)
    MsgBox(0, @ScriptName, $szLabel & " = $ls.GetVersion($szLabel)")

    [/autoit]

    wieder ein Fehler .... :cursing:
    dann

    [autoit]


    Local $aStruct = DllStructCreate("bstr string")
    $bError = $ls.GetVersion(DllStructGetPtr($aStruct)

    [/autoit][autoit][/autoit][autoit]

    $szLabel = DllStructGetData($aStruct, 1)
    MsgBox(0, @ScriptName, $szLabel & " = $ls.GetVersion($szLabel)")

    [/autoit]

    selber Fehler ;(
    Dann

    [autoit]


    Local $aStruct = DllStructCreate("str")
    $bError = $ls.GetVersion(DllStructGetPtr($aStruct,1)

    [/autoit][autoit][/autoit][autoit]

    $szLabel = DllStructGetData($aStruct, 1)
    MsgBox(0, @ScriptName, $szLabel & " = $ls.GetVersion($szLabel)")

    [/autoit]

    immer noch Fehler X(
    dann

    [autoit]


    Local $aStruct = DllStructCreate("str")
    $bError = $ls.GetVersion(DllStructGetPtr($aStruct)

    [/autoit][autoit][/autoit][autoit]

    $szLabel = DllStructGetData($aStruct,1)
    MsgBox(0, @ScriptName, $szLabel & " = $ls.GetVersion($szLabel)")

    [/autoit]

    und jetzt fällt mir nix mehr ein ... ?(
    Bitte sag mir das ich n Fehler gemacht hab ..

  • Schau Dir mal die Hilfe zu DllStructCreate an. So wie Du das machst, funktioniert es nicht.
    Prüfe nach einem Funktionsaufruf auch immer den Rückgabewert oder @error. Dann siehst Du schon, wo Du den Fehler gemacht hast.

  • ... hhäää ?

    WO ?!?

    also in der Hilfe steht :

    [autoit]


    ;create the struct
    Local $rect = DllStructCreate("int;int;int;int")

    [/autoit][autoit][/autoit][autoit]

    ;hab ich umgesetzt mit
    Local $aStruct = DllStructCreate("str")

    [/autoit][autoit][/autoit][autoit]

    ;den @error
    If @error Then
    MsgBox(0, "", "Error in DllStructCreate " & @error);
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ; OK wird noch dran gehängt

    [/autoit][autoit][/autoit][autoit]

    ; jetzt den Pointer übergeben
    ; in der hilfe mit DllStructGetPtr($rect , 1)) für den Pointer der Eintragung in der Struct
    ; sollte ja aber bei nur einer Eintragung im Struct auch mit DllStructGetPtr($rect ) funktionieren. dann ist es halt der pointer auf den ganzen Struct

    [/autoit][autoit][/autoit][autoit]

    ;hab ich umgesetzt mit
    $bError = $ls.GetVersion(DllStructGetPtr($aStruct))
    ;und auch mit
    $bError = $ls.GetVersion(DllStructGetPtr($aStruct,1))

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; da steh ich jetzt wohl total auf dem Schlauch !!
    ; kannst mir da kein "genaueren" Tip geben? ??! BITTE !!

    [/autoit]
  • aaach MOMENT !!

    du meinst dass ich kein Typ " str" oder "bstr" verwenden kann ..

    mmm .. aber was nehm ich denn da alternativ ?!?


    war total in der "ObjCreateInterface" Funktion und DA GIBT es "str" und "bstr" dachte das ist allgemein ..... ?(

  • "str" kommt in der Liste der gültigen Typen nicht vor.

  • ja das sehe ich ja .. hab ich ja im jetzten Beitrag von mir auch geschrieben ..

    ABER was kann ich alternativ nehmen ....

    hab es jetzt mit char und wchar versucht .. in 128 und 256 größe ..

    immer noch Fehler .. ..

  • kann sowas funktionieren ?!?

    Spoiler anzeigen
    [autoit]


    ;$oDataToPostBstr = __IEStringToBstr($sDataToPost) ; convert string to BSTR

    [/autoit] [autoit][/autoit] [autoit]

    Func __IEStringToBstr($s_string, $s_charSet = "us-ascii")
    Local Const $adTypeBinary = 1, $adTypeText = 2
    Local $o_Stream

    [/autoit] [autoit][/autoit] [autoit]

    $o_Stream = ObjCreate("ADODB.Stream")

    [/autoit] [autoit][/autoit] [autoit]

    $o_Stream.Type = $adTypeText
    $o_Stream.CharSet = $s_charSet
    $o_Stream.Open
    $o_Stream.WriteText($s_string)
    $o_Stream.Position = 0

    [/autoit] [autoit][/autoit] [autoit]

    $o_Stream.Type = $adTypeBinary
    $o_Stream.Position = 0

    [/autoit] [autoit][/autoit] [autoit]

    Return $o_Stream.Read
    EndFunc ;==>__IEStringToBstr

    [/autoit] [autoit][/autoit] [autoit]

    Func __IEBstrToString($o_bstr, $s_charSet = "us-ascii")
    Local Const $adTypeBinary = 1, $adTypeText = 2
    Local $o_Stream

    [/autoit] [autoit][/autoit] [autoit]

    $o_Stream = ObjCreate("ADODB.Stream")

    [/autoit] [autoit][/autoit] [autoit]

    $o_Stream.Type = $adTypeBinary
    $o_Stream.Open
    $o_Stream.Write($o_bstr)
    $o_Stream.Position = 0

    [/autoit] [autoit][/autoit] [autoit]

    $o_Stream.Type = $adTypeText
    $o_Stream.CharSet = $s_charSet
    $o_Stream.Position = 0

    [/autoit] [autoit][/autoit] [autoit]

    Return $o_Stream.ReadText
    EndFunc ;==>__IEBstrToString

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    ?!? kann da jemand was mit anfangen ?!? und eventuell umschreiben ?