Leaderboard
Popular Content
Showing content with the highest reputation on 08/09/2016 in all areas
-
Sign your exe with a Digital Signature / Signtool.exe
TheSaint reacted to Tankbuster for a topic
If someone gets offended by this, because he knows already 200 posts about it. Do not reply. Yes, some wrote already here some words what to do. Yes, you are right I created nothing new. But I want this summed up for forum searchers, that maybe find this posting useful in spending less time to find an answer in one place. I don't want to re-animate very old postings. So forgive me if I try to help other idiots like myself. ==================== First I need to give credits to: For summing it up in a nearly complete way. ==================== There is a nice Gui existing that wrapps it up: Digital Sign Tool Below you also find some instructions how to add it to the compiler. ==================== I tested this on a Windows 7 (x64) - but all codes used is x86 (32bit) - for 64bit I need to create another package (or make the script smarter). So here is the sequence in general: general purpose: I created several EXE files of the years, and I do not want to use the SIGNUI to click each file. So I want a command line version. Create a folder - I named it x:cert4me Download from : http://www.kastaban.de/cert4me/MAKE_MY_CERT_FILE.zip The zip: Contains: 1999-04-15 17:10:28 PVKIMPRT.EXE 2003-03-24 23:03:00 makecert.exe 2005-09-23 07:56:00 cert2spc.exe 2006-03-03 23:22:44 signtool.exe 2007-04-11 11:11:20 capicom.dll 2007-09-27 14:17:44 pvk2pfx.exe 2013-03-13 15:24:27 MAKE_MY_CERT_FILE.CMD 2013-03-13 15:31:52 SIGN_FILE.CMD Extract the files in : X:Cert4me now open a cmd in the created folder with the extracted files (the script will also work from other folder but so you are closer to the result...) cd /D x:\cert4me Now you either watch this little video with a sample of the signing process (a little bit fast - but you are to pause it if you like, and sorry for the German screen texts) http://www.kastaban.de/cert4me/CERT4ME/CERT4ME.html or First start : MAKE_MY_CERT_FILE.CMD myNewCertificate secret01 MAKE_MY_CERT_FILE.CMD needs two arguments 1=the name of the certificate 2=your password Sign now the EXE with: SIGN_FILE.CMD "d:\1work\mit space\TFTP_HELPER.exe" keys\myNewCertificate_cert.pfx secret01 SIGN_FILE.CMD needs three arguments 1=the file path of your executable 2=the filepath to the pfx folder (created before !) 3=your password Done. in case you want to sign more than one EXE repeat the "Sign now" step with the other EXE. ================= I packed the files from the original post and added additional files to offer a complete package. this was tested on Windows 7 (64bit) but all tools and my EXE are 32bit . Keep this in mind. For 64bit the similar tools of 64bit are maybe needed (not sure). Maybe someone could start to convert this to a AU3.....because some fields are still left open. Like the End DATE, email field, timestamps URL..... And "if" someone got additional stuff to add here (for other idio.....mmmh......searchers), do it. And most important , in case I wrote something wrong or it does not work for you please comment. ======================================================================== //edit: 16.03.2013 - Thx Emiel - as always I face problems with the NOT and Or :-)1 point -
Running AutoIt code from any web browser
Marc reacted to scintilla4evr for a topic
For some time I was wondering how to execute AutoIt code from a web browser. I made some solutions using IE.au3, but that's only one browser. Is there a way to execute AutoIt from ANY browser? There is one - custom protocols. So, I looked how to add one, and here it is - running AutoIt from any web browser. AutoIt Protocol Example (run install.au3 before!): 2+2 in a MsgBox Edit: you can't use this protocol in posts here, how sad Have fun!1 point -
1 point
-
Glad the problem could be solved The version of AutoIt shouldn't make a difference.1 point
-
Mouse Capture Tool
PravinJillu reacted to JLogan3o13 for a topic
@PravinJillu then look at _IsPressed in the help file. You can combine this function with the MouseGetPos function, something like this (pseudo-code only, look at the example in the help file): If _IsPressed(<HexKey For Left Mouse Button>) Then ;Write MouseGetPos coordinates to Excel file EndIf1 point -
Mouse Capture Tool
PravinJillu reacted to JLogan3o13 for a topic
@PravinJillu welcome to the forum. To answer your question, yes that is all possible in AutoIt, although there are much easier ways to automate Excel than capturing mouseclicks. Please be aware, however, that this forum is dedicated to helping people with their own scripts; it is not a place where people will write it all for you. We are, however, happy to assist you along the way. Take a look at the following: See this code as a framework, just to get you started. You can read up on GUI elements in the help file to decide what elements (buttons, input fields, combo boxes, radio buttons, etc.) you want to include in your GUI. #include <GUIConstantsEx.au3> $hGUI = GUICreate("Test", 300, 300) GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Take a look at MouseGetPos in the help file. This function will return the current X,Y coordinates of the mouse. However, as I mentioned, trying to automate Excel through mouseclicks is really unnecessary. Look through the _Excel_ functions in the help file; pretty much anything you want to do within Excel can be done with these functions, in a much more stable manner than mouseclicks. Do some reading in the help file, try out some of the examples, and see what you can come up with. If you get stuck, please post what you have and we'll do our best to help1 point -
Hello. try something like this. #include <WinAPIProc.au3> #include <WinAPI.au3> #include <WinAPISys.au3> #include <Array.au3> #include <GUIConstants.au3> #include <APISysConstants.au3> Global $hGUI = GUICreate("GUI") GUISetState(@SW_SHOW, $hGUI) GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), 'WM_SHELLHOOK') _WinAPI_RegisterShellHookWindow($hGUI) Run("notepad.exe") Local $nMsg=0 While 1 $nMsg = GUIGetMsg() Select Case $nMsg = $GUI_EVENT_CLOSE ExitLoop EndSelect WEnd _WinAPI_DeregisterShellHookWindow($hGUI) Exit Func WM_SHELLHOOK($hWnd, $iMsg, $wParam, $lParam) #forceref $iMsg Switch $wParam Case $HSHELL_WINDOWDESTROYED ConsoleWrite('Destroyed: ' & @CRLF & _ @TAB & 'PID: ' & WinGetProcess($lParam) & @CRLF & _ ; This will be -1. @TAB & 'ClassName: ' & _WinAPI_GetClassName($lParam) & @CRLF & _ ; This will be empty. @TAB & 'hWnd: ' & $lParam & @CRLF) ; This will be the handle of the window closed. Case $HSHELL_WINDOWCREATED ConsoleWrite('Created: ' & @CRLF & _ @TAB & 'PID: ' & WinGetProcess($lParam) & @CRLF & _ @TAB & 'ClassName: ' & _WinAPI_GetClassName($lParam) & @CRLF & _ @TAB & 'hWnd: ' & $lParam & @CRLF) ; This will be the handle of the window closed. EndSwitch EndFunc ;==>WM_SHELLHOOK Saludos1 point
-
on "AutoIt Error" - please help with fastest way to close it.
argumentum reacted to Danyfirex for a topic
You're Wellcome. Saludos1 point -
I made a working script from your code snippet and it worked without any probelm with AutoIt 3.3.12.0 and 3.3.15.0 with Office 2010 on Windows 7. #include <Excel.au3> Global $Serial = @HOUR & ":" & @MIN & ":" & @SEC, $ComputerName = "Test", $Domain = "MyDomain", $Username = @UserName, $Password = "Secret" Local $oExcel = _Excel_Open() If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Test", "Error starting Excel." & @CRLF & "@error = " & @error & ", @extended = " & @extended) Local $sFilePath = @ScriptDir & "\ComputerName.xls" Local $workbook = _Excel_BookOpen($oExcel, $sFilePath) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Test", "Error opening to workbook." & @CRLF & "@error = " & @error & ", @extended = " & @extended) Local $aArray2D[1][5] = [[$Serial, $ComputerName, $Domain, $Username, $Password]] _Excel_RangeInsert($workbook.activesheet, "A2:E2", $xlShiftDown) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Test", "Error inserting to worksheet." & @CRLF & "@error = " & @error & ", @extended = " & @extended) _Excel_RangeWrite($workbook, $workbook.Activesheet, $aArray2D, "A2") If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Test", "Error writing to worksheet." & @CRLF & "@error = " & @error & ", @extended = " & @extended) _Excel_BookSave($workbook) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Test", "Error saving workbook." & @CRLF & "@error = " & @error & ", @extended = " & @extended) _Excel_BookClose($workbook) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Test", "Error closing workbook." & @CRLF & "@error = " & @error & ", @extended = " & @extended) _Excel_Close($oExcel)1 point
-
on "AutoIt Error" - please help with fastest way to close it.
argumentum reacted to Danyfirex for a topic
Hello. Probably something like this could work. #NoTrayIcon #include <APISysConstants.au3> #include <GUIMenu.au3> #include <WinAPIProc.au3> #include <WinAPISys.au3> #include <WindowsConstants.au3> #Region Globals Global $hEventProc = 0 Global $hEventHook = 0 #EndRegion Globals If @Compiled Then Exit MsgBox(262144, @ScriptName, "run this test from SciTE" & @CR & "this is just a test", 5) #include <WinAPI.au3>; for _WinAPI_FindWindow #include <Misc.au3>; for _IsPressed If StringInStr($CmdLineRaw, "DoACrash") Then DoACrash() Func DoACrash() Local $a = "caca" $a[1] = "more caca" EndFunc ;==>DoACrash _RegisterAutoitMsgErrorHandler() Run('"' & @AutoItExe & '" "' & @ScriptFullPath & '" DoACrash') ; to create the initial crash catchTheCrash() Func catchTheCrash() AutoItWinSetTitle("if this window not found, then, a crash catcher is wanted ???") Local $hDLL = DllOpen("user32.dll") Local $w, $t = TimerInit() While 1 ToolTip("press and hold ""ESC"" to exit." & @CR & "loop time: " & Round(TimerDiff($t)) & " mSec.") $t = TimerInit() Sleep(20) If _IsPressed("1B", $hDLL) Then Exit 0 ; ESC key $w = _WinAPI_FindWindow("#32770", "AutoIt Error") ; very fast, does not affect CPU much If $w Then ;~ WinSetState($w, "", @SW_HIDE) ; all these are slow. Is there a faster way to not show the MsgBox ? ;~ ConsoleWrite("--- " & @MIN & ":" & @SEC & "." & @MSEC & @CRLF & _ ;~ ControlGetText("AutoIt Error", "", "Static2") & @CRLF) ;~ WinClose($w) Run('"' & @AutoItExe & '" "' & @ScriptFullPath & '" DoACrash') ; ..to keep on crashing ;) EndIf WEnd EndFunc ;==>catchTheCrash Func _RegisterAutoitMsgErrorHandler() If $hEventProc Or $hEventProc Then _FreeHandles() EndIf $hEventProc = DllCallbackRegister('_EventProc', 'none', 'ptr;dword;hwnd;long;long;dword;dword') If $hEventProc = 0 Then Return False $iRegistered = OnAutoItExitRegister('_FreeHandles') If $iRegistered = 0 Then Return False $hEventHook = _WinAPI_SetWinEventHook($EVENT_SYSTEM_ALERT, $EVENT_SYSTEM_ALERT, DllCallbackGetPtr($hEventProc)) If $hEventHook = 0 Then Return False Return True EndFunc ;==>_RegisterAutoitMsgErrorHandler Func _FreeHandles() If $hEventHook Then _WinAPI_UnhookWinEvent($hEventHook) If $hEventProc Then DllCallbackFree($hEventProc) $hEventHook = 0 $hEventProc = 0 EndFunc ;==>_FreeHandles Func _EventProc($hEventHook, $iEvent, $hWnd, $iObjectID, $iChildID, $iThreadId, $iEventTime) #forceref $hEventHook, $iObjectID, $iChildID, $iThreadId, $iEventTime Local $iPID = "" Local Const $sAutoit = "Autoit" Local $sWinTitle = "" Local $sError = "" $sWinTitle = WinGetTitle($hWnd) _WinAPI_GetWindowThreadProcessId($hWnd, $iPID) If StringInStr($sWinTitle, $sAutoit) Then ;~ WinSetState($hWnd,"",@SW_HIDE) $sError = ControlGetText($hWnd, "", "Static2") ConsoleWrite("PID: " & $iPID & @TAB & "Error: " & $sError & @CRLF) ProcessClose($iPID) EndIf EndFunc ;==>_EventProc Saludos1 point -
Super Idle Down Process
argumentum reacted to InternetMonkeyBoy for a topic
Do you mean "NtDelayExecution" instead of "ZwDelayExecution"? Seems to have to same effect. Also once a call has been made to ntddll.dll it appears you do not even need static or global >> a simpel local works just the same.1 point -
For Loop Infinite
232showtime reacted to Gianni for a topic
one more way is setting Step = 0 (just for fun) Local $end For $i = 0 To 0 Step 0 ConsoleWrite($i & @CRLF) ; ..... $end += 1 If $end = 10 Then $i = 1 ; to exit set $i > of the To value Next1 point -
Hello. As Melba says Correct way is using While. But a for can be infinite this way. For $i = 0 To 1 Msgbox(64, "Succes", $i) $i-=1 Next Saludos1 point
-
June 12, 2016: New SciTE4AutoIt3 available with the updated SciTE v3.6.6 release.
argumentum reacted to Jos for a topic
Correct, but that is already fixed in the current available Beta version. Thanks Jos1 point -
June 12, 2016: New SciTE4AutoIt3 available with the updated SciTE v3.6.6 release.
argumentum reacted to Glowshi for a topic
In AutoIt3Wrapper.au3 the lines If $INP_Run_Stop_OnError And $ExitCode Then should be If $INP_Run_Stop_OnError = "y" And $ExitCode Then1 point -
Convert Multi-Page TIFF to Single Page
TouchOdeath reacted to ViciousXUSMC for a topic
I needed to add in the getframecount function. After I am getting an error on the DLL Call $aResult = DllCall($ghGDIPDll, "int", "GdipImageGetFrameCount", "handle", $hImage, "ptr", $pGUID, "uint*", 0) Missing a declaration for $ghGDIPDII Edit: Searched and found it should be $__g_hGDIPDll Got my working code up to this for now. I may make it even more automated and actually automate the scan in the future. #include <GDIPlus.au3> #include <Array.au3> #include <File.au3> #pragma compile(Icon, E:\Users\it022565\Desktop\Desktop\System Tools\iconsext\icons\imageres_34.ico) $sScans = "C:\Scans" $sProcessed = "C:\Scans\Processed\" $sMerged = "C:\Scans\Merged\" Local $sDrive Local $sDir Local $sFileName Local $sExtension DirCreate($sProcessed) DirCreate($sMerged) $aFiles = _FileListToArray($sScans, "*.tif", $FLTA_FILES, True) _GDIPlus_Startup() For $i2 = 1 to $aFiles[0] $aPathSplit = _PathSplit($aFiles[$i2], $sDrive, $sDir, $sFileName, $sExtension) Global $aBitmaps = _GDIPlus_ImageLoadFromMultiPageImage($aFiles[$i2]) Global $i, $iW = 0, $iH = 0, $iX = 0 For $i = 1 to $aBitmaps[0] $iW += _GDIPlus_ImageGetWidth($aBitmaps[$i]) $iH = _GDIPlus_ImageGetHeight($aBitmaps[$i]) > $iH ? _GDIPlus_ImageGetHeight($aBitmaps[$i]) : $iH Next $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap) $iW = 0 For $i = $aBitmaps[0] To 1 Step - 1 _GDIPlus_GraphicsDrawImageRect($hGfx, $aBitmaps[$i], $iW, 0, _GDIPlus_ImageGetWidth($aBitmaps[$i]), _GDIPlus_ImageGetHeight($aBitmaps[$i])) $iW += _GDIPlus_ImageGetWidth($aBitmaps[$i]) Next $sSave = $sMerged & $sFileName & ".gif" _GDIPlus_ImageRotateFlip($hBitmap, 6) _GDIPlus_ImageSaveToFile($hBitmap, $sSave) _GDIPlus_GraphicsDispose($hGfx) _GDIPlus_BitmapDispose($hBitmap) For $i = 1 to $aBitmaps[0] _GDIPlus_BitmapDispose($aBitmaps[$i]) Next FileMove($aFiles[$i2], $sProcessed) Next _GDIPlus_Shutdown() ;ShellExecute($sSave) Func _GDIPlus_ImageLoadFromMultiPageImage($sPath) Local $hImage = _GDIPlus_ImageLoadFromFile($sPath) If @error Then Return SetError(1, 1, False) Local $iCount = _GDIPlus_ImageGetFrameDimensionsCount($hImage) If Not $iCount Then Return SetError(1, 2, False) Local $aList = _GDIPlus_ImageGetFrameDimensionsList($hImage) If @error Or Not IsArray($aList) Then Return SetError(1, 3, False) Local $iPixelFormat, $iImageW, $iImageH Local $aReturn[1], $iCnt = 0 For $i = 1 To $aList[0] $iCount = _GDIPlus_ImageGetFrameCount($hImage, $aList[$i]) For $j = 1 To $iCount _GDIPlus_ImageSelectActiveFrame($hImage, $aList[$i], $j) $iCnt += 1 ReDim $aReturn[$iCnt + 1] $iPixelFormat = _GDIPlus_ImageGetPixelFormat($hImage) $iImageW = _GDIPlus_ImageGetWidth($hImage) $iImageH = _GDIPlus_ImageGetHeight($hImage) $aReturn[$iCnt] = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iImageW, $iImageH, $iPixelFormat) Next Next _GDIPlus_ImageDispose($hImage) $aReturn[0] = $iCnt Return $aReturn EndFunc ;==>_GDIPlus_ImageLoadFromMultiPageImage Func _GDIPlus_ImageGetFrameDimensionsCount($hImage) Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameDimensionsCount", "handle", $hImage, "uint*", 0) If @error Then Return SetError(@error, @extended, -1) If $aResult[0] Then Return SetError(10, $aResult[0], False) Return $aResult[2] EndFunc ;==>_GDIPlus_ImageGetFrameDimensionsCount Func _GDIPlus_ImageGetFrameDimensionsList($hImage) Local $iI, $iCount, $tBuffer, $pBuffer, $aPropertyIDs[1], $aResult $iCount = _GDIPlus_ImageGetFrameDimensionsCount($hImage) If @error Then Return SetError(@error, @extended, -1) $tBuffer = DllStructCreate("byte[" & $iCount * 16 & "]") $pBuffer = DllStructGetPtr($tBuffer) $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameDimensionsList", "handle", $hImage, "ptr", $pBuffer, "int", $iCount) If @error Then Return SetError(@error, @extended, -1) If $aResult[0] Then Return SetError(10, $aResult[0], False) ReDim $aPropertyIDs[$iCount + 1] $aPropertyIDs[0] = $iCount For $iI = 1 To $iCount $aPropertyIDs[$iI] = _WinAPI_StringFromGUID($pBuffer) $pBuffer += 16 Next Return $aPropertyIDs EndFunc ;==>_GDIPlus_ImageGetFrameDimensionsList Func _GDIPlus_ImageSaveAddImage($hImage, $hImageNew, $pParams) Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipSaveAddImage", "handle", $hImage, "handle", $hImageNew, "ptr", $pParams) If @error Then Return SetError(@error, @extended, False) If $aResult[0] Then Return SetError(10, $aResult[0], False) Return $aResult[0] = 0 EndFunc ;==>_GDIPlus_ImageSaveAddImage Func _GDIPlus_ImageGetFrameCount($hImage, $sDimensionID) Local $tGUID, $pGUID, $aResult $tGUID = _WinAPI_GUIDFromString($sDimensionID) $pGUID = DllStructGetPtr($tGUID) $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameCount", "handle", $hImage, "ptr", $pGUID, "uint*", 0) If @error Then Return SetError(@error, @extended, -1) If $aResult[0] Then Return SetError(10, $aResult[0], -1) Return $aResult[3] EndFunc ;==>_GDIPlus_ImageGetFrameCount Func _GDIPlus_ImageSelectActiveFrame($hImage, $sDimensionID, $iFrameIndex) Local $pGUID, $tGUID, $aResult $tGUID = DllStructCreate($tagGUID) $pGUID = DllStructGetPtr($tGUID) _WinAPI_GUIDFromStringEx($sDimensionID, $pGUID) $aResult = DllCall($__g_hGDIPDll, "uint", "GdipImageSelectActiveFrame", "handle", $hImage, "ptr", $pGUID, "uint", $iFrameIndex) If @error Then Return SetError(@error, @extended, False) If $aResult[0] Then Return SetError(10, $aResult[0], False) Return True EndFunc ;==>_GDIPlus_ImageSelectActiveFrame1 point -
Convert Multi-Page TIFF to Single Page
TouchOdeath reacted to UEZ for a topic
You can do something like this here: #include <GDIPlus.au3> _GDIPlus_Startup() Global $aBitmaps = _GDIPlus_ImageLoadFromMultiPageImage(@ScriptDir & "\Test3.tif") Global $i, $iW = 0, $iH = 0, $iX = 0 For $i = 1 to $aBitmaps[0] $iW += _GDIPlus_ImageGetWidth($aBitmaps[$i]) $iH = _GDIPlus_ImageGetHeight($aBitmaps[$i]) > $iH ? _GDIPlus_ImageGetHeight($aBitmaps[$i]) : $iH Next $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap) $iW = 0 For $i = $aBitmaps[0] To 1 Step - 1 _GDIPlus_GraphicsDrawImageRect($hGfx, $aBitmaps[$i], $iW, 0, _GDIPlus_ImageGetWidth($aBitmaps[$i]), _GDIPlus_ImageGetHeight($aBitmaps[$i])) $iW += _GDIPlus_ImageGetWidth($aBitmaps[$i]) Next $sSave = @ScriptDir & "\Test3.gif" _GDIPlus_ImageRotateFlip($hBitmap, 6) _GDIPlus_ImageSaveToFile($hBitmap, $sSave) _GDIPlus_GraphicsDispose($hGfx) _GDIPlus_BitmapDispose($hBitmap) For $i = 1 to $aBitmaps[0] _GDIPlus_BitmapDispose($aBitmaps[$i]) Next _GDIPlus_Shutdown() ShellExecute($sSave) ;code by Eukalyptus Func _GDIPlus_ImageLoadFromMultiPageImage($sPath) Local $hImage = _GDIPlus_ImageLoadFromFile($sPath) If @error Then Return SetError(1, 1, False) Local $iCount = _GDIPlus_ImageGetFrameDimensionsCount($hImage) If Not $iCount Then Return SetError(1, 2, False) Local $aList = _GDIPlus_ImageGetFrameDimensionsList($hImage) If @error Or Not IsArray($aList) Then Return SetError(1, 3, False) Local $iPixelFormat, $iImageW, $iImageH Local $aReturn[1], $iCnt = 0 For $i = 1 To $aList[0] $iCount = _GDIPlus_ImageGetFrameCount($hImage, $aList[$i]) For $j = 1 To $iCount _GDIPlus_ImageSelectActiveFrame($hImage, $aList[$i], $j) $iCnt += 1 ReDim $aReturn[$iCnt + 1] $iPixelFormat = _GDIPlus_ImageGetPixelFormat($hImage) $iImageW = _GDIPlus_ImageGetWidth($hImage) $iImageH = _GDIPlus_ImageGetHeight($hImage) $aReturn[$iCnt] = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iImageW, $iImageH, $iPixelFormat) Next Next _GDIPlus_ImageDispose($hImage) $aReturn[0] = $iCnt Return $aReturn EndFunc ;==>_GDIPlus_ImageLoadFromMultiPageImage Func _GDIPlus_ImageGetFrameDimensionsCount($hImage) Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameDimensionsCount", "handle", $hImage, "uint*", 0) If @error Then Return SetError(@error, @extended, -1) If $aResult[0] Then Return SetError(10, $aResult[0], False) Return $aResult[2] EndFunc ;==>_GDIPlus_ImageGetFrameDimensionsCount Func _GDIPlus_ImageGetFrameDimensionsList($hImage) Local $iI, $iCount, $tBuffer, $pBuffer, $aPropertyIDs[1], $aResult $iCount = _GDIPlus_ImageGetFrameDimensionsCount($hImage) If @error Then Return SetError(@error, @extended, -1) $tBuffer = DllStructCreate("byte[" & $iCount * 16 & "]") $pBuffer = DllStructGetPtr($tBuffer) $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameDimensionsList", "handle", $hImage, "ptr", $pBuffer, "int", $iCount) If @error Then Return SetError(@error, @extended, -1) If $aResult[0] Then Return SetError(10, $aResult[0], False) ReDim $aPropertyIDs[$iCount + 1] $aPropertyIDs[0] = $iCount For $iI = 1 To $iCount $aPropertyIDs[$iI] = _WinAPI_StringFromGUID($pBuffer) $pBuffer += 16 Next Return $aPropertyIDs EndFunc ;==>_GDIPlus_ImageGetFrameDimensionsList1 point