Jump to content
Sign in to follow this  
toasterking

DllCall Code Generator

Recommended Posts

Thanks. Works fine for easy DLL calls and is good for beginners. If there are more difficult DLL functions with pointer to structs then it will not work anymore, but it's a good start.


Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Share this post


Link to post
Share on other sites

Can't argue with that, I'm sure this will be very useful to a lot of people.

Since your screenshot and link refer to "GetDiskFreeSpace", you probably should start with that in the appropriate input field rather than MessagBox.

Good work.

EDIT:

After trying your linked example "GetDiskFreeSpace" I turned my attentions to "GetDiskFreeSpaceEx" and seen that the PULARGE_INTEGER type is not supported in your early script, I believe it is "uint64*" in AutoIt.

I'm sure there will be more to add if you continue to support the tool.

Edited by JohnOne

AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Share this post


Link to post
Share on other sites

J1,

Thanks for your compliments!

Since your screenshot and link refer to "GetDiskFreeSpace", you probably should start with that in the appropriate input field rather than MessagBox.

 

I agree.  I didn't actually mean to leave MessageBoxW as the default field value there.  I was using that for testing and forgot to remove it.  Fixed.

After trying your linked example "GetDiskFreeSpace" I turned my attentions to "GetDiskFreeSpaceEx" and seen that the PULARGE_INTEGER type is not supported in your early script, I believe it is "uint64*" in AutoIt.

 

 

You are correct.  I somehow missed PULARGE_INTEGER, ULARGE_INTEGER, and LARGE_INTEGER in the conversion function.  I added them.  If you enter an unknown MSDN type now, it prompts for the correct AutoIt type in case you are smarter than it is.

Edit:  GetDiskFreeSpaceEx works for me now.

Edited by toasterking

Share this post


Link to post
Share on other sites

Thanks. Works fine for easy DLL calls and is good for beginners. If there are more difficult DLL functions with pointer to structs then it will not work anymore, but it's a good start.

 

Thanks!  It is not complete and it may never be.  But I wanted to put it out there in the hopes that it can benefit someone as-is.

Share this post


Link to post
Share on other sites

Thx.  

I posted something about DllCall in the C# section. Care to take a look.  It is too complex for me and I cant find the corresponding values in the lookup.  I cant do it :(

 


Skysnake

Why is the snake in the sky?

Share this post


Link to post
Share on other sites

Looks good for DllCall beginners =)

Thanks!

But instand of 1000 cases in _ConvertType, why you dont work with arrays?

Mostly for speed.  It's habit; I make optimizations when I see them.  Try this example code.  The same lookup operation takes 3 times as long with an array as with a Switch statement.

My times:
Lookup1 time: 5993.06858483286 ms
Lookup2 time: 15289.7226984924 ms

Global $aLookup[15][2] = [[1,"one"], _
                         [2,"two"], _
                         [3,"three"], _
                         [4,"four"], _
                         [5,"five"], _
                         [6,"six"], _
                         [7,"seven"], _
                         [8,"eight"], _
                         [9,"nine"], _
                         [10,"ten"], _
                         [11,"eleven"], _
                         [12,"twelve"], _
                         [13,"thirteen"], _
                         [14,"fourteen"], _
                         [15,"fifteen"]]

Local $tTest = TimerInit()
For $i = 1 To 1000000
    _Lookup1("fifteen")
Next
ConsoleWrite("Lookup1 time: " & TimerDiff($tTest) & " ms" & @CRLF)

$tTest = TimerInit()
For $i = 1 To 1000000
    _Lookup2("fifteen")
Next
ConsoleWrite("Lookup2 time: " & TimerDiff($tTest) & " ms" & @CRLF)

Func _Lookup1($sName)
    Switch $sName
        Case "one"
            Return 1
        Case "two"
            Return 2
        Case "three"
            Return 3
        Case "four"
            Return 4
        Case "five"
            Return 5
        Case "six"
            Return 6
        Case "seven"
            Return 7
        Case "eight"
            Return 8
        Case "nine"
            Return 9
        Case "ten"
            Return 10
        Case "eleven"
            Return 11
        Case "twelve"
            Return 12
        Case "thirteen"
            Return 13
        Case "fourteen"
            Return 14
        Case "fifteen"
            Return 15
        Case Else
            Return 0
    EndSwitch
EndFunc

Func _Lookup2($sName)
    For $i = 1 To UBound($aLookup) - 1
        If $sName = $aLookup[$i][1] Then Return $aLookup[$i][0]
    Next
    Return 0
EndFunc

If you prefer arrays for readability, you're welcome to rewrite it. :)

 

Share this post


Link to post
Share on other sites

I posted something about DllCall in the C# section. Care to take a look.  It is too complex for me and I cant find the corresponding values in the lookup.  I cant do it :(

Honestly, I probably don't know any more than you.  I stopped when I reached the limit of what this code generator can do because that was all I've needed so far.  If the code generator can't solve it and it's not covered on pages 1 to 8 of the linked PDF, I probably can't do it either.  Good luck, though!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By IndianSage
      Hi,
      My AutoIt script is as folllows:
      ;use for calling function add2NosA in dll ;Local $vNo1 = 33 ;Local $vNo2 = 11 ;use for calling function sortNos in dll Local $vNo1 = [11,7,9] Local $vNo2 = [1,3,2] ; _ArrayDisplay($vNo1, "vNo1 display") ; _ArrayDisplay($vNo2, "vNo2 display") ;Local $hWnd = DllOpen("E:\CV-Dell-1\autoit3\myComObj1.dll") Local $hWnd = ObjCreate("myComObj1.clsMath") if (@error) Then MsgBox (0, "Error", "Error1 = " & @error) Exit EndIf ;function call method - DllCall with function name ;Local $aRes = DllCall($hWnd, "int", "addNosA", "int", $vNo1, "int", $vNo2) ;Local $aRes = DllCall($hWnd, "Ptr", "sortNos", "Array", $vNo1, "Array", $vNo2) ;function call method - $hWnd.<function name> ;Local $aRes = $hWnd.add2NosA($vNo1, $vNo2) ; this works fine with ObjCreate Local $aRes = $hWnd.sortNos($vNo1, $vNo2) if (@error) Then MsgBox (0, "Error", "Error2 = " & @error) DllClose($hWnd) Exit EndIf ;use appropriate msgbox ;MsgBox(0,"Result", "Result = " & $vNo1[0]) MsgBox(0,"Result", "Result = " & $aRes) _ArrayDisplay($vNo1, "vNo1 display") _ArrayDisplay($aRes , "aRes display") DllClose($hWnd) My VB.Net - ClassLibrary - Dll - COM obj is as follows - has 2 functions - add2NosA and sortNos:
      <ComClass(clsMath.ClassId, clsMath.InterfaceId, clsMath.EventsId)> Public Class clsMath Public Const ClassId As String = "3A42F85E-24C8-4BAA-91B5-AE56C4683C13" Public Const InterfaceId As String = "D99D7C79-2BA7-4A33-B7BC-9B7F19FDF828" Public Const EventsId As String = "CA128AC4-580C-4112-9EAD-8D1599E3F37A" Public Sub New() MyBase.New() End Sub Public Function add2NosA(ByVal no1 As Integer, ByVal no2 As Integer) As Integer Return (no1 + no2) End Function Public Sub sortNos(ByRef no1 As Array, ByRef no2 As Array) Array.Sort(no1) no2 = no1 End Sub End Class  Over all I tried various 8 options mentioned in the attached Excel file - with only 1 combination working.
      Overall could not make Array returned capture in AutoIt script. 
      Can someone help please?
      Thanks in  advance.
      Options-Tried-Matrix-Results.xlsx
    • By IndianSage
      I have create a function in FreeBasic like below:
      Extern "Windows-MS" Type tA f1 As Integer f2 As Integer End Type Public Function _switchOrder(ByVal no1 As Integer, ByVal no2 As Integer) As tA Export Dim result As Integer Dim taa As tA taa.f1 = no2 taa.f2 = no1 Return taa End Function End Extern Caller AutoIt code is:
      #include <MsgBoxConstants.au3> Global Const $sTag_ftdi_version_info="struct; int no1a; int no2a; endstruct" Local $aRet=DllCall("Math1.dll","Ptr","_switchOrder", "Int", 10, "Int", 30) ;MsgBox (0,"",@error & "-" & $aRet[0] & "-" & $aRet[1]& "-" & $aRet[2]) Local $t_ftdi_version_info=DllStructCreate($sTag_ftdi_version_info,$aRet[0]) MsgBox (0,"msg1=",@error & "---" & $aRet[0] & "-" & $aRet[1]& "-" & $aRet[2]) ;Local $retData1 = DllStructGetData($t_ftdi_version_info,"",1) Local $retData1 = DllStructGetData($t_ftdi_version_info,"no1a") MsgBox (0,"msg2=",@error & "--" & $retData1) ;Local $retData1 = DllStructGetData($t_ftdi_version_info,"",2) Local $retData1 = DllStructGetData($t_ftdi_version_info,"no2a") MsgBox (0,"msg2=",@error & "--" & $retData1) ;ConsoleWrite(DllStructGetData($t_ftdi_version_info,"",2) & "--" & @error) ;ConsoleWrite(DllStructGetData($t_ftdi_version_info,"no2a") & @CRLF) ;ConsoleWrite(DllStructGetData($tversion_str,1) & @CRLF) Getting error 2 for DllStructGetData or it give Close Application AutoIt popup message. 
      Certainly DllCall is not returning pointer to the Structure in $aRet[0] hence issue.
      Can someone help me fix this please?
      Thanks in advance.
       
       
    • By xYuri
      This simple dllcall gives me error 5, access denied,
      Func _WinAPI_VkKeyScan($__key) _WinAPI_SetLastError(0) $res = DllCall('User32.dll', 'SHORT', 'VkKeyScan', 'CHAR', $__key) _xConsole('res: '&$res) $_LastErr = _WinAPI_GetLastError() If $_LastErr <> 0 Then _xConsole('Err: {' & $_LastErr & '}> ' & _WinAPI_GetLastErrorMessage()) Return $res EndFunc Am i doing something wrong?
      Also tried VkKeyScanA and W
      Edit:
      I want to send `:` via PostMessage() WM_KEYDOWN
    • By Skysnake
      This is relevant
      From here https://stackoverflow.com/questions/3454315/is-it-possible-to-pin-a-dll-in-memory-to-prevent-unloading
      I use several UDFs on the Forum to do various things.  Those UDFs work very well.
      Effectively the UDFs are DLL wrappers, that make it possible to access DLL functions easily without the long hard slog of DLLCall() every time.
      However, I have now run into the issue that multiple UDF DLLCalls are slow. Not mind numbingly slow, but slow enough to become noticeable with a large of repeated function calls.
      So I was wondering, is it possible to "load a DLL into memory" and leave it there for the duration of my script's lifetime, avoid repeated DLL on-disk reads with a persistent in memory DLL?
      From Microsoft
      https://docs.microsoft.com/en-us/windows/desktop/dlls/about-dynamic-link-libraries
      Looks like what I want to do is: load-time dynamic linking,
      So next question, (a) how do I do this with AutoIt (b) How would this impact on standard AutoIt type DLL calls?
       
      The point is speed.  Is there a different approach?
      Or am I barking up the wrong tree?
      Skysnake
    • By supersonic
      Hi -
      Currently I'm playing around with Windows Credential Manager. I'm trying to access it with DllCall("advapi32.dll", ...) using the functions 'CredWriteW', 'CredReadW' and 'CredDeleteW'. All well. Another function I have to deal with is 'CredEnumerateW': https://docs.microsoft.com/en-us/windows/desktop/api/wincred/nf-wincred-credenumeratew/ .
      That's the test code I have so far:
      #include <Array.au3> #include <String.au3> Local $tCredentialsCount = DllStructCreate("DWORD;") Local $tPointerToArrayOfPointers = DllStructCreate("PTR;") ; Local $tPointerToArrayOfPointers = DllStructCreate(_StringRepeat("PTR;", 200)) ; ??? Local $aResult = DllCall("advapi32.dll", "BOOL", "CredEnumerateW", _ "WSTR", Null, "DWORD", 1, "DWORD", DllStructGetPtr($tCredentialsCount), "PTR", DllStructGetPtr($tPointerToArrayOfPointers)) If (Not @error) Then Local $iCredentialsCount = DllStructGetData($tCredentialsCount, 1) _ArrayDisplay($aResult, $iCredentialsCount) Local $hPointerToArrayOfPointers = DllStructGetData($tPointerToArrayOfPointers, 1) MsgBox(0, "$hPointerToArrayOfPointers", $hPointerToArrayOfPointers) ; Fails... For $i = 1 To 10 ; $iCredentialsCount MsgBox(0, $i & "___" & (($i * 2) - 1), DllStructGetData($tPointerToArrayOfPointers, ($i * 2) - 1)) Next $tCredentialsCount = 0 $tPointerToArrayOfPointers = 0 DllCall("advapi32.dll", "NONE", "CredFreeW", "PTR", $hPointerToArrayOfPointers) EndIf The DllCall seems to function properly - I get a valid count of credentials (on my computer ~ 133) and a pointer "to array of pointers".
      What is meant by "array of pointers"?
      Microsoft says: Pointer to an array of pointers to credentials. The returned credential is a single allocated block. Any pointers contained within the buffer are pointers to locations within this single allocated block.
      How to access these pointers... Contained within the buffer???
      Any information you can provide me would be greatly appreciated.
×
×
  • Create New...