Параметр 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), когда путь не существует или файл не найден.