Jump to content

DllCall() with C example - struct in call


Recommended Posts

bool SMSAPI_sendsms(
const LPSMSAPI_NETWORKCONFIGURATION lpNetConfig, 
const LPSMSAPI_ACCOUNTINFO lpAccInfo, 
const LPSMSAPI_MESSAGEINFO lpMsgInfo, 
LPSMSAPI_RESPONSEINFO lpResponseInfo);

How does one call this in an AutoIt DllCall() - I do not see "const" conversions and how does one insert the pointers?

 

Skysnake

Why is the snake in the sky?

Link to post
Share on other sites

You should do something like this.

;~ First declare your structures
Local $tnetworkConfiguration=DllStructCreate($sTagSMSAPI_NETWORKCONFIGURATION)
Local $taccountInfo=DllStructCreate($sTagSMSAPI_ACCOUNTINFO)
Local $tmessageInfo=DllStructCreate($sTagSMSAPI_MESSAGEINFO)
Local $tresponseInfo=DllStructCreate($sTagSMSAPI_RESPONSEINFO)

;~ Set defaults values initialize_defaults

DllCall($h_smstxt32,"bool","sms_initialize_defaults","ptr",DllStructGetPtr($tnetworkConfiguration),"int",DllStructGetSize($tnetworkConfiguration))
DllCall($h_smstxt32,"bool","sms_initialize_defaults","ptr",DllStructGetPtr( $taccountInfo),"int",DllStructGetSize($taccountInfo))
DllCall($h_smstxt32,"bool","sms_initialize_defaults","ptr",DllStructGetPtr($tmessageInfo),"int",DllStructGetSize($tmessageInfo))
DllCall($h_smstxt32,"bool","sms_initialize_defaults","ptr",DllStructGetPtr($tresponseInfo),"int",DllStructGetSize($tresponseInfo))



;~ set some details
$tnetworkConfiguration.nIdealPort = 80;                 //-- use the standard HTTP internet port
$taccountInfo.defaultServerID = (SMSAPI_SERVER)serverID;    //-- connect to the South Africa commerce server
$taccountInfo.szSMSAPIUsername,lpszUsername);       //-- set the bulksms account username
$taccountInfo.szSMSAPIPassword,lpszPassword);       //-- set the bulksms account password   
$tmessageInfo.szMessageText,lpszMessage);           //-- set the message text
$tmessageInfo.lpszCommaSeperatedMobileList = lpszMobile;    //-- set the message recipient list (comma seperated)

;~ then call sendsms

DllCall($h_smstxt32,"bool","sms_sendsms","ptr",DllStructGetPtr($tnetworkConfiguration),"ptr",DllStructGetPtr($taccountInfo),"ptr",DllStructGetPtr($tmessageInfo),"ptr",DllStructGetPtr($tresponseInfo))

Saludos

Edited by Danyfirex
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
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By argumentum
      ..where to start. I've posted: 
      now I wanna pull the data from WTSSessionInfo and WTSSessionInfoEx as described in https://docs.microsoft.com/en-us/windows/win32/api/wtsapi32/ns-wtsapi32-wtsinfoa
      typedef struct _WTSINFOA { WTS_CONNECTSTATE_CLASS State; <--- that is an enumeration from https://docs.microsoft.com/en-us/windows/win32/api/wtsapi32/ne-wtsapi32-wts_connectstate_class DWORD SessionId; DWORD IncomingBytes; DWORD OutgoingBytes; DWORD IncomingFrames; DWORD OutgoingFrames; DWORD IncomingCompressedBytes; DWORD OutgoingCompressedBy; CHAR WinStationName[WINSTATIONNAME_LENGTH]; CHAR Domain[DOMAIN_LENGTH]; CHAR UserName[USERNAME_LENGTH + 1]; LARGE_INTEGER ConnectTime; LARGE_INTEGER DisconnectTime; LARGE_INTEGER LastInputTime; LARGE_INTEGER LogonTime; LARGE_INTEGER CurrentTime; } WTSINFOA, *PWTSINFOA; from the example in ListUserSessions() I get, say:
      24 WTSSessionInfo _________ 0x00000000070000000D930F00229CDD00000000000000000000000000000000005244502D5463702331313700000000000000000000000000000000000000000050433032370000000000000000000000006C756973790000000000000000000000000000000000002174A0FB1B0AD70100000000000000000625AF0A200AD701AF99E5FB1B0AD701A56FBA0A200AD701 25 WTSSessionInfoEx _______ 0x01000000000000000700000000000000010000005244502D54637023313137000000000000000000000000000000000000000000006C756973790000000000000000000000000000000050433032370000000000000000000000000000000000AF99E5FB1B0AD7012174A0FB1B0AD70100000000000000000625AF0A200AD701BBBDBA0A200AD7010D930F00229CDD0000000000000000000000000000000000 My question is: how do I get the binary example above ( WTSSessionInfo ) into a struct to DllStructGetData().
      Thanks
      Solution at https://www.autoitscript.com/forum/topic/205232-struct-_wtsinfo/?do=findComment&comment=1475912   
       
    • 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
×
×
  • Create New...