Sign in to follow this  
Followers 0
Locodarwin

DllStructCreate: Struct of a Struct Possible?

3 posts in this topic

I'm automating the Canon SDK for the Canon PowerShot A640 series digital camera, and I've come up against a situation that I'd like to find a clean solution for.

Is it possible to create a DLLStruct in AutoIt that is basically an array of another struct?

The export function PR_GetDllsVersion() retrieves the version number of the DLL modules used in the SDK. Its syntax is:

PR_GetDllsVersion(
            prUInt32*           pBufferSize,
            prDllsVerInfo*      pDllVersion
                  );

In C, the structs associated with this function look like this:

typedef struct{
    prWChar ModuleName[512];                /* Module name (512 characters) */
    prWChar Version[32];                    /* Version (32 characters) */
}prVerInfo;

typedef struct{
    prUInt32  Entry;                        /* Number of modules included in this structure */
    prVerInfo VerInfo[prANY];                 /* Array of file version number information of PS-ReC SDK modules */
}prDllsVerInfo;

So according to this, prDllsVerInfo contains an array of the prVerInfo data type, which in turn is a user defined struct.

I presume I can just pass a simple char array that is the total size of prVerInfo and parse the data out myself later, but I'm looking for a cleaner way to do it that logically follows how it would be done in C.

Any suggestions?

Thanks in advance,

-S


(Yet Another) ExcelCOM UDF"A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly...[indent]...specialization is for insects." - R. A. Heinlein[/indent]

Share this post


Link to post
Share on other sites



Bump.


(Yet Another) ExcelCOM UDF"A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly...[indent]...specialization is for insects." - R. A. Heinlein[/indent]

Share this post


Link to post
Share on other sites

;#1
;creating
$iCount = 5
$sVerInfo = "wchar[512];wchar[32];"
$sDllsVerInfo = "uint;"
For $i = 1 To $iCount
    $sDllsVerInfo &= $sVerInfo
Next
$sDllsVerInfo = StringTrimRight($sDllsVerInfo, 1)
$tDllsVerInfo = DllStructCreate($sDllsVerInfo)
DllStructSetData($tDllsVerInfo, 1, $iCount)
;reading back:
For $i = 1 To DllStructSetData($tDllsVerInfo, 1)
    ConsoleWrite('Module name: ' & DllStructGetData($tDllsVerInfo, $i * 2) & @CRLF)
    ConsoleWrite('Version: ' & DllStructGetData($tDllsVerInfo, $i * 2 + 1) & @CRLF)
Next

;#2
;creating
$iCount = 5
$iSizeVerInfo = (512+32)*2
$tDllsVerInfo = DllStructCreate('uint;byte[' & $iSizeVerInfo * $iCount & ']')
DllStructSetData($tDllsVerInfo, 1, $iCount)
;reading back:
For $i = 0 To DllStructSetData($tDllsVerInfo, 1) - 1
    $tVerInfo = DllStructCreate("wchar[512];wchar[32]", DllStructGetPtr($tDllsVerInfo, 2) + $iSizeVerInfo * $i)
    ConsoleWrite('Module name: ' & DllStructGetData($tVerInfo, 1) & @CRLF)
    ConsoleWrite('Version: ' & DllStructGetData($tVerInfo, 2) & @CRLF)
Next


"be smart, drink your wine"

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  
Followers 0