Что нового

Помогите с DllStructGetData()

S

sh01u

Гость
Здравствуйте, в autoit я не бум - бум, как получить lpDirectory в строковом виде, а не ptr?


Код:
Local $stINFO,$stVerb,$stPath,$stArgs,$stWDir,$aRet, $hWnd = 0, $iState = @SW_SHOWNORMAL

$stVerb = DllStructCreate("wchar[255]")
$stPath = DllStructCreate("wchar[" & (StringLen("notepad.exe")+1)& "]")
$stArgs = DllStructCreate("wchar[255)]")
$stWDir = DllStructCreate("wchar[255]")

DllStructSetData($stVerb, 1, "")
DllStructSetData($stPath, 1, "notepad.exe")
DllStructSetData($stWDir, 1, "")
DllStructSetData($stArgs, 1, "")



Local $stINFO = DllStructCreate("ulong;ulong;long;ptr;ptr;ptr;ptr;long;long;ptr;ptr;long;ulong;long;long")

DllStructSetData($stINFO, 1, DllStructGetSize($stINFO))
DllStructSetData($stINFO, 2, BitOR(0x40,0x400))
DllStructSetData($stINFO, 3, $hWnd) ; Is this supposed to *receive* instead of send? I have yet to get clarity on this.
DllStructSetData($stINFO, 4, DllStructGetPtr($stVerb))  ; lpVerb: pointer to the verb string
DllStructSetData($stINFO, 5, DllStructGetPtr($stPath))  ; lpFile: pointer to the $cmd string
DllStructSetData($stINFO, 6, DllStructGetPtr($stArgs))  ; lpParameters: pointer to the parameters/arguments string
DllStructSetData($stINFO, 7, DllStructGetPtr($stWDir))  ; lpDirectory: pointer to working directory string
DllStructSetData($stINFO, 8, $iState)

$aRet = DllCall("shell32.dll", "int", "ShellExecuteExW", "struct*", DllStructGetPtr($stINFO))


MsgBox(0,0,DllStructGetData($stINFO,7))
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Автор
S

sh01u

Гость
InnI сказал(а):
sh01u [?]
в autoit я не бум - бум
Печально :(

как получить lpDirectory в строковом виде
Код:
MsgBox(0,0,DllStructGetData($stWDir,1))


НО! Прежде, чем получить, его нужно задать ;)
Например, так
Код:
DllStructSetData($stWDir, 1, @DesktopDir)

Это я понимаю, только возвращаемое значения это hex допустим 0x007ACCE8, а мне нужна строка "С:\Users\User\Desktop", наверно надо изменить саму структуру, не ptr, а str?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
sh01u
Если вы хотите получить строку по указателю, то нужно, сначала, создать структуру по этому указателю, а затем, прочитать данные из структуры
Код:
$tStr = DllStructCreate("wchar[255]",DllStructGetData($stINFO,7))
MsgBox(0,0,DllStructGetData($tStr,1))
Но в контексте вашего примера это не имеет смысла, т.к. функция ShellExecuteEx не возвращает значение в $stWDir, а получает его из этого поля структуры и передаёт запущенной программе.
 

Атос

Новичок
Сообщения
85
Репутация
0
InnI, а как получить аргумент?

Код:
Local $stINFO,$stVerb,$stPath,$stArgs,$stWDir,$aRet, $hWnd = 0, $iState = @SW_SHOWNORMAL
$stVerb = DllStructCreate("wchar[255]")
$stPath = DllStructCreate("wchar[" & (StringLen("notepad.exe")+1)& "]")
$stArgs = DllStructCreate("wchar[255)]")
$stWDir = DllStructCreate("wchar[255]")
DllStructSetData($stVerb, 1, "open")
DllStructSetData($stPath, 1, "notepad.exe")
DllStructSetData($stArgs, 1, "C:\Temp\4.txt")
DllStructSetData($stWDir, 1, "C:\Temp")
Local $stINFO = DllStructCreate("ulong;ulong;long;ptr;ptr;ptr;ptr;long;long;ptr;ptr;long;ulong;long;long")
DllStructSetData($stINFO, 1, DllStructGetSize($stINFO))
DllStructSetData($stINFO, 2, BitOR(0x40,0x400))
DllStructSetData($stINFO, 3, $hWnd) ; Is this supposed to *receive* instead of send? I have yet to get clarity on this.
DllStructSetData($stINFO, 4, DllStructGetPtr($stVerb))  ; lpVerb: pointer to the verb string
DllStructSetData($stINFO, 5, DllStructGetPtr($stPath))  ; lpFile: pointer to the $cmd string
DllStructSetData($stINFO, 6, DllStructGetPtr($stArgs))  ; lpParameters: pointer to the parameters/arguments string
DllStructSetData($stINFO, 7, DllStructGetPtr($stWDir))  ; lpDirectory: pointer to working directory string
DllStructSetData($stINFO, 8, $iState)
MsgBox(0,0,DllStructGetData($stINFO,6))
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Атос [?]
как получить аргумент?
Точно так же
Код:
MsgBox(0,0,DllStructGetData($stArgs,1))
; или
$tStr = DllStructCreate("wchar[255]",DllStructGetData($stINFO,6))
MsgBox(0,0,DllStructGetData($tStr,1))


Только в коде есть опечатка. В строке
Код:
$stArgs = DllStructCreate("wchar[255)]")
лишняя скобка ")". Нужно так
Код:
$stArgs = DllStructCreate("wchar[255]")
 
Верх