kaushik_code Ответов: 2

Параметр Windows API


Кто-нибудь использовал следующий API windows

HRESULT UploadPrinterDriverPackage(
  _In_     LPCTSTR pszServer,
  _In_     LPCTSTR pszInfPath,
  _In_     LPCTSTR pszEnvironment,
  _In_     DWORD dwFlags,
  _In_     HWND hwnd,
  _Out_    LPTSTR pszDestInfPath,
  _Inout_  PULONG pcchDestInfPath
);


Я хочу знать, что такое 5-й параметр API?В документации говорится -
hwnd [in] - A handle to the copying user interface.


что просто не имеет особого смысла.


У меня не было никакого успеха, чтобы заставить этот API работать и продолжать получать возвращаемое значение E_INVALIDARGS. Поскольку другие параметры довольно прямолинейны, я предполагаю, что что-то не так с 5-м параметром.
Я могу предположить, что это может быть дескриптор окна, который должен показывать ход операции загрузки, хотя я был бы рад использовать бесшумный флаг. Тем не менее, я попытался использовать NULL, а также дескриптор диалога (созданный с помощью CreateDialog) в этом API, но тщетно.

Любая помощь будет глубоко оценена.

cariolihome

Да, вы правы. Это родительское окно для любого окна, которое будет показано системой во время загрузки
Поэтому, пожалуйста, укажите другие параметры. Это может помочь решить возвращаемое значение E_INVALIDARGS.

kaushik_code

Не уверен, правильно ли я вас понял. Вот другие аргументы
pszServer = NULL
pszInfpath = локальный путь к файлу INF драйвера. (например, c:\abcd.inf)
pszEnvironment = Windows NT x86 (как уже упоминалось в документации, я использую 32-битную систему)
элемент dwflags - UPDP_UPLOAD_ALWAYS
hwnd - ?
pszDestInfPath-указатель на массив wchar из 100 символов.
pcchDestInfPath-100

Можете ли вы помочь мне узнать, каким должен быть 5-й параметр или есть проблема с каким-то другим?

cariolihome

5-й параметр может быть нулевым или дескриптором любого существующего окна
Причиной ошибки E_INVALIDARGS является плохое значение другого параметра
Поэтому, пожалуйста, укажите точные значения всех параметров.
(попробуйте установить pszEnvironment в NULL, так как inf-файл содержит информацию о поддерживаемой целевой системе)

kaushik_code

Спасибо за ваш ответ . Я думаю, что первые 5 параметров ясны из моего предыдущего комментария. Что касается 6-го и 7-го параметров, то вот что я сделал:

WCHAR pszDestInfPath[100] = {0};
Тип ulong cchDestInfPath = оператор sizeof(pszDestInfPath)/оператор sizeof(тип данных wchar);

UploadPrinterDriverPackage (
НУЛЕВОЙ,
Л"C:\abcd.inf",
L " Windows NT x86",
UPDP_UPLOAD_ALWAYS,
hwndDlg, / *допустимый дескриптор, созданный более ранним вызовом CreateDialog*/
pszDestInfPath,
&cchDestInfPath
);

cariolihome

Попробуй вот это:

WCHAR szDestInfPath[MAX_PATH];
ULONG cchDestInfPath = MAX_PATH;

UploadPrinterDriverPackage(
НУЛЕВОЙ,
Л"C:\AnyFolder\InfFile.inf",
НУЛЕВОЙ,
0,
НУЛЕВОЙ,
szDestInfPath,
&cchDestInfPath);

Имеет ли inf-файл директиву CatalogFile ?
Существует ли в файловой системе файл *.cat, указанный в директиве CatalogFile ?

kaushik_code

Да, я постараюсь дать вам знать . Это подписанный драйвер с действительным файлом. cat.

cariolihome

Дополнительную информацию о процессе установки драйвера вы можете найти в разделе C:\Windows\Inf\setupapi.dev.log

kaushik_code

Да, вы правы. Но ничего, связанного с копированием или установкой, даже не начинается. API немедленно выходит из строя, ничего не делая. Но да, я обязательно посмотрю и на это.

cariolihome

Согласно реализации функции UploadPrinterDriverPackage cchDestInfPath не может быть меньше символов MAX_PATH.

kaushik_code

Как вы это нашли ?

cariolihome

Путем разборки реализации функции.

kaushik_code

Это действительно очень полезная информация и большой недостаток в документации. Я могу информировать Вас о своих находках завтра. Но пока что, если вы дадите мне знать, какие инструменты полезны для разборки и извлечения такого рода информации, это будет здорово. Еще раз большое спасибо. Буду держать вас в курсе.

cariolihome

Для получения ограничений параметров достаточно использовать Microsoft Visual Studio в режиме отладки.

kaushik_code

Большое спасибо. Это сработало идеально!

kaushik_code

Привет,

Застрял в другой проблеме. Не уверен, что вы действительно когда-либо использовали этот API для установки драйверов на удаленные машины.Мне удалось локально установить драйвер. Но когда я пытаюсь установить на удаленном сервере 2008 R2 / 2012, я вижу, что файлы драйверов изначально копируются в результате этого вызова API, но в конечном итоге API терпит неудачу с "операция не поддерживается", и операция копирования откатывается.

Я видел точно такое же поведение, когда использовал rundll32, printui.dll PrintUIENtry метод для достижения той же цели.

Интересно, возможно ли удаленно установить драйверы принтера, если у вас нет exe-файла, запущенного на удаленной машине? Или это специфическая ОС?

cariolihome

Вы смотрели файлы журналов setupapi на обеих машинах ?

Jochen Arndt

Обратная косая черта в именах путей должна быть экранирована. Поэтому вы должны использовать:
Л"C:\\abcd.inf"
Однако я не знаю, приводит ли это к E_INVALIDARGS. Я бы ожидал, что какой-то файл не найден ошибка.

cariolihome

Вы правы. Конечно, обратная косая черта в именах путей должна быть экранирована.
Функция возвращает HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) и HRESULT_FROM_WIN32 (ERROR_FILE_NOT_FOUND), когда путь не существует или файл не найден.

2 Ответов

Рейтинг:
1

kaushik_code

Спасибо cariolihome за этот комментарий

According to the UploadPrinterDriverPackage function implementation cchDestInfPath cant be less then MAX_PATH character


BillWoodruff

Пожалуйста, отправляйте ответы и комментарии человеку, который оставил вам комментарий или ответил на ваш вопрос, используя команду "есть вопрос или комментарий?" кнопка. Не публикуйте ответы/комментарии как "решения", как вы это делаете здесь.

kaushik_code

Но комментарий привел к решению здесь. Вот почему он был вставлен в качестве решения.

Рейтинг:
0

KarstenK

если вы используете флаг UPDP_SILENT_UPLOAD, то должен работать нулевой hwnd. Видеть UploadPrinterDriverPackage документация.