Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибка `E_INVALIDARG` в Delphi 2010: Регистрация приложения в службе StillImage на Windows XP

Delphi , ОС и Железо , Windows

Ошибка E_INVALIDARG в Delphi 2010: Регистрация приложения в службе StillImage на Windows XP

В процессе разработки приложений на Delphi, особенно при работе с внешними библиотеками и сервисами, разработчики могут столкнуться с различными ошибками. Одной из таких ошибок является E_INVALIDARG, возникающая при попытке регистрации приложения в службе StillImage. В этом материале мы рассмотрим причины возникновения данной ошибки и способы её устранения на примере использования сервиса StillImage в среде Delphi 2010 на операционной системе Windows XP SP3.

Описание проблемы

Проблема заключается в том, что при вызове метода RegisterLaunchApplication сервиса StillImage возвращается ошибка E_INVALIDARG или STIERR_INVALID_PARAM. Это означает, что один или несколько аргументов, переданных в метод, являются некорректными.

Шаги для воспроизведения ошибки

  1. Создание модуля интерфейса StillImage с использованием Windows.pas и определение констант, типов и функций интерфейса IStillImageW.
  2. Вызов функции StiCreateInstanceW для создания экземпляра интерфейса IStillImageW.
  3. Инициализация строк для имени приложения и команды, передаваемых в метод RegisterLaunchApplication.
  4. Вызов метода RegisterLaunchApplication с переданными строками.

Пример кода

unit StillImage;
interface
uses
  Windows;
const
  STI_VERSION = $00000002;
type
  IStillImageW = interface(IUnknown)
  ['{641BD880-2DC8-11D0-90EA-00AA0060F86C}']
  // ... интерфейс ...
  function RegisterLaunchApplication(AppName, CommandLine: LPWSTR): HRESULT; stdcall;
  // ... интерфейс ...
  end;
PIStillImageW = ^IStillImageW;
function StiCreateInstanceW(hinst: HINST; dwVer: DWORD; ppSti: PIStillImageW; punkOuter: IUnknown): HResult; stdcall; external 'sti.dll' name 'StiCreateInstanceW';
implementation
end.

// ... в основном блоке программы ...
var
  Still_Image: IStillImageW;
  H_Res: HResult;
  pwszAppName, pwszCommandLine: PWideChar;
  wszAppName, wszCommandLine: array[0..1000] of WideChar;
begin
  // ... инициализация ...
  H_Res := StiCreateInstanceW(GetModuleHandle(nil), STI_VERSION, @Still_Image, nil);
  // ... проверка результата ...
  FillChar(wszAppName, SizeOf(wszAppName), 0);
  FillChar(wszCommandLine, SizeOf(wszCommandLine), 0);
  pwszAppName := StringToWideChar('Calculator', @wszAppName, SizeOf(wszAppName)-SizeOf(Char));
  pwszCommandLine := StringToWideChar('c:\WINDOWS\system32\calc.exe', @wszCommandLine, SizeOf(wszCommandLine)-SizeOf(Char));
  H_Res := Still_Image.RegisterLaunchApplication(pwszAppName, pwszCommandLine);
  // ... обработка результата ...
end.

Подтвержденный ответ

Проблема заключается в том, что функция StringToWideChar получает размер строки в байтах, а должна получать длину строки в символах. Это приводит к тому, что строка не завершается нулевым символом, что и является причиной ошибки E_INVALIDARG. Правильный вызов функции должен выглядеть так:

pwszAppName := StringToWideChar('Calculator', @wszAppName, Length('Calculator'));
pwszCommandLine := StringToWideChar('c:\WINDOWS\system32\calc.exe', @wszCommandLine, Length('c:\WINDOWS\system32\calc.exe'));

Альтернативный ответ

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

H_Res := Still_Image.RegisterLaunchApplication('Calculator', 'c:\WINDOWS\system32\calc.exe');

или, если у вас есть строки в переменных:

H_Res := Still_Image.RegisterLaunchApplication(PChar(str1), PChar(str2));

Заключение

При работе с внешними сервисами и библиотеками важно внимательно следить за типами данных и корректностью передаваемых параметров. В данном случае, проблема была связана с некорректным определением размера строки. Исправление этого момента позволит избежать ошибки E_INVALIDARG при регистрации приложения в службе StillImage.

Создано по материалам из источника по ссылке.

заключается в том, что при попытке регистрации приложения в службе StillImage на Delphi 2010 с использованием Windows XP, возникает ошибка `E_INVALIDARG` из-за некорректной передачи аргументов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 02:26:15/0.0033438205718994/0