Aufruf von DLLs

  • Hallo zusammen
    ich wieder

    Habe noch ein Problem mit dem zugriff auf Funktionen von DLLs.

    Unter VB ruf ich diese wie folgt auf:

    Declare Function cwbSY_CreateSecurityObj Lib "cwbsy.dll" (ByRef securityHandle As Long) As Long
    Declare Function cwbSY_SetSys Lib "cwbsy.dll" (ByVal securityHandle As Long, ByVal systemName As String) As Long
    Declare Function cwbSY_Logon Lib "cwbsy.dll" (ByVal securityHandle As Long) As Long
    Declare Function cwbSV_CreateErrHandle Lib "CWBSV" (errorHandle As Long) As Integer
    Declare Function cwbSY_LogonUser Lib "cwbsy.dll" (ByVal securityHandle As Long, ByVal UserId As String, ByVal Password As String, ByVal errorHandle As Long) As Long


    rc = cwbSV_CreateErrHandle(lErrHandle)
    rc = cwbSY_CreateSecurityObj(lSecHandle)
    rc = cwbSY_SetSys(lSecHandle, sSystem)
    rc = cwbSY_LogonUser(lSecHandle, UserId, Password, lErrHandle)
    checkDBUser = rc


    Wie kann ich denn soetwas in autoit nachstellen ?

    Über eine Hilfe oder Anregung wäre ich absolut dankbar.

    Bis dann

  • Danke für deine Info.
    Mit diesem Befehl bin ich am Testen.
    Nur der Erfolg stellt sich leider nicht ein.
    Scheint irgendwie mit den Parametern nicht hinzuhauen, daher dachte ich wenn jemand den VB Source sieht vielleicht weiß derjenige wie das in Autoit programmiert werden müssten.

    Danke

  • Leider komme ich nicht weiter.
    Ich möchte via Inputbox oder Formular den Usernamen und das Passwort abfragen. Dieses gebe ich dann weiter an Funktionen in einer DLL cwbco.dll.

    Dies ist eine DLL von IBM Client Access (Zugriff auf eine AS400).
    In Visual Basic haben wir den Zugriff schon mal realisiert, aber VB soll nicht verwendet werden (daher der erste Postingeintrag).

    Leider bekomme ich als Return Wert immer nur 0 zurück. Egal was ich probiere. Habe schon tausend Möglichkeiten ausprobiert (Variablen in dem Aufruf mit STR und LONG oder INT gesetzt ....).

    Ich denke ich habe noch immer irgendwo Syntaxprobleme :-((

    Leider war bisher alles ohne Erfolg.

    Was geht ist wenn ich den @error abfrage. Dann bekomme ich als Rückgabewert die 0 oder 1 oder 3, d.h. er kennt meine DLL und auch die Funktion, aber irgendwie tut er mit den Werten in der Funktion nichts, oder schreibe ich den Return Wert falsch zurück ?

    Ich poste mal den code, vielleicht hat jemand noch ne Idee. habe jetzt den ganzen Tag versucht das zum Laufen zu bringen, leider bisher ohne Erfolg (naja, nicht ganz, verschlüsseln und paar kleinere Dinge gehen, wenigstens etwas. )

    Hier mal der Code (nicht erschrecken über die ganzen vairablen, ist halt nur ein Versuch irgendwie herauszubekommen wer was wie schreibt.)

    Danke Euch allen schonmal

    #include <string.au3>
    #include <GUIConstants.au3>


    Run("regedit /s D:\SoftM_Start\Reg\Alkor_Suite_T0.reg";)


    Dim $useridout
    Dim $userid
    Dim $useridstd
    Dim $useridSoftm
    Dim $password
    Dim $userpassver
    Dim $userpassent
    Dim $userpassreg
    Dim $NameAS400
    Dim $DLL
    Dim $Temp
    Dim $FehlerCode
    Dim $okbutton
    Dim $msg
    Dim $SecurityHandle
    Dim $error

    Dim $DLL2
    Dim $DLL3
    Dim $SecHandle
    Dim $ErrHandle
    Dim $rc
    Dim $securityhandle
    Dim $errorhandle
    Dim $sSystem
    Dim $listhandle

    Dim $Test
    Dim $Test2
    Dim $Test3
    Dim $Test4
    Dim $Test5


    $NameAS400 = RegRead("HKEY_CURRENT_USER\Software\SoftM\Global\Parametersteuerung", "System";)
    $useridout = RegRead("HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication", "User ID";)
    $useridstd = RegRead("HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication", "Signon Mode";)
    $useridsoftm = RegRead("HKEY_CURRENT_USER\Software\SoftM\Global\Environment", "StandardUser";)
    $userpassreg = RegRead ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"User PW";)
    RegWrite ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"Signon Mode", "REG_DWORD", 1)

    $sSystem = $NameAS400

    If ($useridsoftm = "" and $useridout = "";) or ($useridsoftm = "" and $useridout <> "";) Then
    ;Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
    GUICreate("Anmeldung AS/400", 200, 200)
    GUICtrlCreateLabel("AS/400 UserName:", 42, 35, 131, 27)
    $userid = GUICtrlCreateInput("", 42, 50, 121, 21)
    GUICtrlCreateLabel("AS/400 Passwort:", 42, 85, 111, 17)
    $password = GUICtrlCreateInput("", 42, 100, 121, 21)
    $okbutton = GUICtrlCreateButton("OK", 70, 145, 60)


    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $okbutton
    _OKUserPasswort($NameAS400, GUICtrlRead($userid), GUICtrlRead($password))
    GUISetState(@SW_HIDE)
    ExitLoop
    EndSwitch
    WEnd
    Else
    if $NameAS400<>"" and $userpassreg And $useridout<>"" Then
    _OKUserPasswort($NameAS400,$useridout,_StringEncrypt(0,$userpassreg,"passwortencrypten",2)) ;Ich hoffe ich habe die Variablen sinngemäss benutzt.
    EndIf
    EndIf
    If $useridsoftm <> "" Then
    ;UserName aus SoftM Suite-Einstellungen ist der führende und wird im IBM Client Access Registry eingetragen/überschrieben
    RegWrite ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"User ID", "REG_SZ", $useridsoftm)
    $userpassent = _StringEncrypt ( 0, $userpassreg, "passwortencrypten" , 2)
    ;As/400-Logon in Windoes-Cach schreiben
    ShellExecute("C:\Program Files\IBM\Client Access\cwblogon", " " & $NameAS400 & " /u " & $useridsoftm & " /p " & $userpassent)
    EndIf


    $DLL = DllOpen("cwbsy.dll";)
    $DLL2 = DllOpen("cwbsv.dll";)
    $DLL3 = DLLOpen("cwbco.dll";)


    MsgBox(4096,"hallo"," Hier kommts Username: " & GUICtrlRead($userid))
    MsgBox(4096,"hallo"," Hier kommts Passwort: " & guictrlread($password))
    MsgBox(4096,"hallo"," Hier kommts AS400: " & $NameAS400)

    ;$Temp = DLLCall($DLL, "Int", "cwbSY_CreateSecurityObj", "Int", $1SecHandle)
    ;$Temp2 = DLLCall($DLL, "Int", "cwbSY_SetSys", "Int", $1SecHandle, "String", $NameAS400)
    ;$Temp3 = DLLCall($DLL, "Int", "cwbSY_Logon", "Int", $1SecHandle)
    ;$Temp4 = DLLCall($DLL2, "Int", "cwbSY_CreateErrHandle", "Int", $1ErrHandle)
    ;$Temp5 = DLLCall($DLL, "Int", "cwbSY_LogonUser", "Int", $1SecHandle, "String", GUICtrlRead($useridin), "String", GUICtrlRead($userpass), "Int", $1ErrHandle)


    $Temp = _cwbCO_CreateSystem($sSystem, $securityhandle)
    $Temp2 = _cwbCO_SetUserIDEx($securityhandle, $userid)
    $Temp3 = _cwbCO_SetPassword($securityhandle, $password)
    $Temp4 = _cwbCO_Signon($securityhandle, $errorhandle)
    $Temp5 = _cwbCO_CreateSysListHandle($listhandle, $errorhandle)
    ;checkDBUser = rc


    MsgBox(4096,"hallo"," Hier kommts CreateSystem Temp: " & $Temp)
    MsgBox(4096,"hallo"," Hier kommts SetUserIDEx Temp: " & $Temp2)
    MsgBox(4096,"hallo"," Hier kommts SetPassword Temp: " & $Temp3)
    MsgBox(4096,"hallo"," Hier kommts Signon Temp: " & $Temp4)
    MsgBox(4096,"hallo"," Hier kommts Sys Handle: " & $Temp5)


    Func _cwbCO_CreateSystem($sSystem, ByRef $securityhandle)
    $Test = DLLCall($DLL3, "Int", "cwbCO_CreateSystem", $sSystem, $securityhandle)
    MsgBox(4096,"hallo"," Hier kommts createsystem signon Func: " & $Test)
    Return $Test
    EndFunc

    Func _cwbCO_Signon(ByRef $securityhandle, $errorhandle)
    $Test2 = DLLCall($DLL3, "Int", "cwbCO_Signon", $securityhandle, $errorhandle)
    MsgBox(4096,"hallo"," Hier kommts create signon Func: " & $Test2)
    Return $Test2
    EndFunc

    Func _cwbCO_SetUserIDEx(ByRef $securityhandle, $userid)
    $Test3 = DLLCall($DLL3, "Int", "cwbCO_SetUserIDEx", $securityhandle, $userid)
    MsgBox(4096,"hallo"," Hier kommts setuseridex signon Func: " & $Test3)
    return $Test3
    EndFunc

    Func _cwbCO_SetPassword(ByRef $securityhandle, $password)
    $Test4 = DLLCall($DLL3, "Int", "cwbCO_SetPassword", $securityhandle, $password)
    MsgBox(4096,"hallo"," Hier kommts set password signon Func: " &$Test4)
    return $Test4
    EndFunc

    Func _cwbCO_CreateSysListHandle($listhandle, $errorhandle)
    $Test5 = DLLCall($DLL3, "Int", "cwbCO_CreateSysListHandle", $listhandle, $errorhandle)
    MsgBox(4096,"hallo"," Hier kommts set sys list handle Func: " & $Test5)
    return $Test5
    EndFunc


    Run("D:\Program Files\SoftM AG\SoftM AG Suite\smumenu.exe";)


    Func _OKUserPasswort($NameAS400, $useridin, $userpass)
    ;As/400-Logon in Windoes-Cach schreiben
    ShellExecute("C:\Program Files\IBM\Client Access\cwblogon.exe", " " & $NameAS400 & " /u " & $useridin & " /p " & $userpass,@SW_HIDE)
    ;UserName + UserPassword (verschlüsselt) in Regestri von IBM Client Access schreiben
    RegWrite ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"User ID", "REG_SZ", $useridin)
    $userpassver = _StringEncrypt(1, $userpass, "passwortencrypten", 2)
    RegWrite ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"User PW", "REG_SZ", $userpassver)
    ;ShellExecute($run, '', '', '', @SW_HIDE)
    EndFunc ;==>_start

    2 Mal editiert, zuletzt von jmewald (19. März 2007 um 17:55)

  • hi,

    mir ist nur aufgefallen das du bei einigen string verknüpfungen kein space vor oder nach dem & hast

    falsch (var1& var2)
    richtig (var1 & var2)

    kannst du den code mal als datei posten

    lg neon

  • Den Scriptcode gibst Du mit dem 'AutoIt-Icon'-Button links neben dem Button für den 'Spoiler'(eckige Klammern) ein, oder Du schreibst in's Textfeld: ["AutoIt"] ...Code... ["/Autoit"] ( ohne die " ).
    Um den Code zu verstecken: ["Spoiler"]["AutoIt"] ...Code... ["/Autoit"]["/Spoiler"] (natürlich auch ohne die " ).

    Spoiler anzeigen
    [autoit]

    ; Beispiel
    #NoTrayIcon

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

    Run("regedit /s D:\SoftM_Start\Reg\Alkor_Suite_T0.reg";) ; Falsch: " ; " setzt man nicht bei AutoIt !!!

    [/autoit]

    Das Semikolon braucht man nicht bei AutoIt...(Außer für Kommentare), bei C++ ja, und dann ganz am Ende der Zeile, aber nicht bei AutoIt ! ;)


    Gruß
    Greenhorn

    Edit: Zeile 74 hat einen Fehler:

    [autoit]

    if $NameAS400<>"" and $userpassreg And $useridout<>"" Then ; Falsch

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

    if $NameAS400<>"" and $userpassreg<>"" And $useridout<>"" Then ; Richtig !

    [/autoit]

    -----------------------------------------


    4 Mal editiert, zuletzt von Greenhorn (20. März 2007 um 21:38)