AutoIt DLL Call - PullRequest
       32

AutoIt DLL Call

1 голос
/ 28 февраля 2011

Я недавно задал вопрос о том, как настроить плитки пользователя Windows 7 с помощью скрипта. Я нашел ответ в блоге здесь: http://joco.name/2010/12/06/i-discovered-the-new-windows-user-tile-api/

Моя проблема в том, что я не хочу зависимости от .NET Framework, которая требуется этой программе, поэтому я надеялся вызвать ее напрямую через функцию DllCall () AutoIt3. Однако независимо от того, что я делаю, я не могу заставить это работать:

#RequireAdmin
FileCopy("user_tile.jpg", "C:\Windows\system32\user_tile.jpg")
$rtn = DllCall(@SystemDir & "\shell32.dll", "long", 262, "wstr", "ahiscox", "int", 0, "wstr", "C:\Windows\system32\user_tile.jpg")
MsgBox(16, "DLL Return", $rtn[0])

Я получаю возвращаемое значение от вызова -2147024894, некоторые Googling предположили, что shell32.dll не находит файл user_tile.jpg. После изменения на wstr эта ошибка исчезла и была заменена на возврат -2147221008. Теперь я застрял и не могу понять, что я делаю неправильно, когда я запускаю код, ничего не происходит (пользовательский тайл не изменяется).

У кого-нибудь есть идеи, что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 31 мая 2011

Спасибо, fejesjoco, Я тоже искал, чтобы преобразовать пример кода из вашего блога в AutoIt и не мог заставить его работать. Предложение CoInitialize сделало это, вы можете найти код AutoIt в этой теме в форумах AutoIt.

$sUserName = "DOMAIN\rvdmast"
$sPicPath = "\\server\data\fotos\rvdmast.jpg"

; call CoInitialize
DLLCall("ole32.dll","int","CoInitialize","ptr",0)

$hPicPath = DLLStructCreate("wchar[128]")
DllStructSetData($hPicPath, 1, $sPicPath)

$hUserName = DLLStructCreate("wchar[128]")
DllStructSetData($hUserName, 1, $sUserName)

$aRet = DllCall(@SystemDir & "\shell32.dll", "long", 262, "ptr", DllStructGetPtr($hUserName), "int", 0, "ptr", DllStructGetPtr($hPicPath))

MsgBox(4096, "SetUserTile", $aRet[0])
2 голосов
/ 08 апреля 2011

Вы могли также спросить автора этого блога, он полезный парень, я знаю это, потому что это я :) Вы должны проверить, находится ли ваша тема в квартире STA. Также вам может потребоваться вызвать CoInitialize самостоятельно, в .NET платформа делает это за вас, но это обязательное условие.

1 голос
/ 01 марта 2011

В блоге упоминается, что вам нужно указать имя пользователя в формате MACHINE \ user или DOMAIN \ user.Кроме этого, я думаю, что вы можете использовать относительный путь к изображению, и вам не нужно устанавливать его в shell32 (и тогда вам, вероятно, также не понадобятся права администратора), но попробуйте это, как только вы заработаете.

...