Meine DLL will nicht

  • hi

    ich habe in delphi eine dll geschrieben:

    Spoiler anzeigen

    so weit ist ja alles schön und gut...

    wenn ich die dll nun aber nutzen will:

    [autoit]

    $dll = DllOpen("write.dll")
    DllCall($dll,"int","WriteText","Str","Hallo dude","int",100,"int",100,"int",130)

    [/autoit]

    bekomm ich nur die meldung :
    blub hat ein problemfestgestellt und muss beendet werden...

    • Offizieller Beitrag

    Hallo,

    versuch mal die cdecl-Methode:

    [autoit]


    $dll = DllOpen("write.dll")
    DllCall($dll,"int:cdecl","WriteText","Str","Hallo dude","int",100,"int",100,"int",130)

    [/autoit]

    wenn's nicht geht häng mal die dll an!

  • So kommt keine Fehlermeldung :S

    [autoit]

    $dll = DllOpen("write.dll")
    DllCall($dll,"int","WriteText","long","Hallo","int",100,"int",100,"int",130)

    [/autoit]
    • Offizieller Beitrag

    Hallo

    Warum willst du das unbedingt mit Delphi machen? Warum nicht direkt mit AutoIt?
    Das beispiel ist zwar schon etwas älter, funktioniert aber noch einwandfrei (Liest in dem Beispiel den momentan gespielten Track von winamp)

    Spoiler anzeigen
    [autoit]

    #include<FontConstants.au3>
    #include<WindowsConstants.au3>
    #NoTrayIcon

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

    AutoItSetOption("TrayMenuMode", 1)
    Dim $Title, $OldTitle
    Dim $song
    Dim $hwnd

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

    $exititem = TrayCreateItem("Exit")
    TraySetState()
    $hwnd = GUICreate("Winamp Tool", 500, 20, 1300, 20, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
    GUISetBkColor(0xFF0000)
    GUISetState()

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

    While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = $exititem
    ExitLoop
    EndSelect
    $OldTitle = $Title
    AutoItSetOption("WinTitleMatchMode", 4)

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

    $Title = WinGetTitle("classname=Winamp v1.x")
    If $OldTitle <> $Title Then
    $song = ParseTitle($Title)
    $rgn = CreateTextRgn($hwnd, $song, 20, "Arial", 1000)
    SetWindowRgn($hwnd, $rgn)
    EndIf
    WEnd
    Func ParseTitle($Title)
    $loc = StringInStr($Title, ". ")
    $ParsedTitle = StringTrimLeft($Title, $loc + 1)
    $loc = StringInStr($ParsedTitle, " - Winamp", 0, -1)
    $ParsedTitle = StringLeft($ParsedTitle, $loc)
    Return $ParsedTitle
    EndFunc ;==>ParseTitle
    Func SetWindowRgn($h_win, $rgn)
    DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $rgn, "int", 1)
    EndFunc ;==>SetWindowRgn

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

    ;Func CombineRgn(ByRef $rgn1, ByRef $rgn2)
    ; DllCall("gdi32.dll", "long", "CombineRgn", "long", $rgn1, "long", $rgn1, "long", $rgn2, "int", 2)
    ;EndFunc

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

    Func CreateTextRgn(ByRef $CTR_hwnd, $CTR_Text, $CTR_height, $CTR_font = "Microsoft Sans Serif", $CTR_weight = 1000)
    Local Const $OUT_CHARACTER_PRECIS = 2
    Local Const $CLIP_DEFAULT_PRECIS = 0
    Local Const $PROOF_QUALITY = 2
    Local Const $FIXED_PITCH = 1
    Local Const $RGN_XOR = 3

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

    If $CTR_font = "" Then $CTR_font = "Microsoft Sans Serif"
    If $CTR_weight = -1 Then $CTR_weight = 1000
    Local $gdi_dll = DllOpen("gdi32.dll")
    Local $CTR_hDC = DllCall("user32.dll", "int", "GetDC", "hwnd", $CTR_hwnd)
    Local $CTR_hMyFont = DllCall($gdi_dll, "hwnd", "CreateFont", "int", $CTR_height, "int", 0, "int", 0, "int", 0, _
    "int", $CTR_weight, "int", 0, "int", 0, "int", 0, "int", $ANSI_CHARSET, "int", $OUT_CHARACTER_PRECIS, _
    "int", $CLIP_DEFAULT_PRECIS, "int", $PROOF_QUALITY, "int", $FIXED_PITCH, "str", $CTR_font)
    Local $CTR_hOldFont = DllCall($gdi_dll, "hwnd", "SelectObject", "int", $CTR_hDC[0], "hwnd", $CTR_hMyFont[0])
    DllCall($gdi_dll, "int", "BeginPath", "int", $CTR_hDC[0])
    DllCall($gdi_dll, "int", "TextOut", "int", $CTR_hDC[0], "int", 0, "int", 0, "str", $CTR_Text, "int", StringLen($CTR_Text))
    DllCall($gdi_dll, "int", "EndPath", "int", $CTR_hDC[0])
    Local $CTR_hRgn1 = DllCall($gdi_dll, "hwnd", "PathToRegion", "int", $CTR_hDC[0])
    Local $CTR_rc = DllStructCreate("int;int;int;int")
    DllCall($gdi_dll, "int", "GetRgnBox", "hwnd", $CTR_hRgn1[0], "ptr", DllStructGetPtr($CTR_rc))
    Local $CTR_hRgn2 = DllCall($gdi_dll, "hwnd", "CreateRectRgnIndirect", "ptr", DllStructGetPtr($CTR_rc))
    DllCall($gdi_dll, "int", "CombineRgn", "hwnd", $CTR_hRgn2[0], "hwnd", $CTR_hRgn2[0], "hwnd", $CTR_hRgn1[0], "int", $RGN_XOR)
    DllCall($gdi_dll, "int", "DeleteObject", "hwnd", $CTR_hRgn1[0])
    DllCall("user32.dll", "int", "ReleaseDC", "hwnd", $CTR_hwnd, "int", $CTR_hDC[0])
    DllCall($gdi_dll, "int", "SelectObject", "int", $CTR_hDC[0], "hwnd", $CTR_hOldFont[0])
    DllClose($gdi_dll)
    Return $CTR_hRgn2[0]
    EndFunc ;==>CreateTextRgn

    [/autoit]

    Mfg Spider

  • Probier mal die Stringübergabe auf der DLL-Seite mir pchar.

    Und dann so aufrufen:

    $ret = DllCall($dll,"int","WriteText","str*","Hallo dude","int",100,"int",100,"int",130)
    _ArrayDisplay($ret)