ドライバーをインストールするためにいくつかの Windows API を呼び出すのに問題があります。具体的には:
SetupCopyOEMInfまたはDriverPackageInstall
私が使用したプロトタイプは、おそらく Unicode 文字列またはポインターの使用が原因で、機能していないようです。注: Inno Setup の Unicode ビルドを使用しています。一部のパラメーターは NULL である可能性がありますが、コード セクションで NULL を指定する方法がわかりません。
私が試したプロトタイプは次のとおりです。
function SetupCopyOEMInf(SourceInfFileName: String;
OEMSourceMediaLocation: String; OEMSourceMediaType: Longword;
CopyStyle: Longword; DestinationInfFileName: String;
DestinationInfFileNameSize: Longword; var RequiredSize: Longword;
DestinationInfFileNameComponent: String): Longword;
external 'SetupCopyOEMInfW@setupapi.dll stdcall setuponly';
function GetLastError(): Longword;
external 'GetLastError@kernel32.dll stdcall setuponly';
type
InstallerInfo = record
pApplicationId: String;
pDisplayName: String;
pProductName: String;
pMfgName: String;
end;
function DriverPackageInstall(DriverPackageInfPath: String;
Flags: Longword; pInstallerInfo: InstallerInfo;
var pNeedReboot: Longword): Longword;
external 'DriverPackageInstall@files:difxapi.dll stdcall setuponly';
プロトタイプは正しいかもしれませんが、別のエラーが発生しています。わかりません。呼び出しが失敗し (失敗コードが返される)、C プログラムから同じ呼び出しを行うと正常に動作するため、何かがおかしいことはわかっています。
更新 1:
DriverPackageInstall
すぐには役に立たないかもしれません。DLL は、使用する前に登録する必要があります。それが不可能だと言っているわけではありませんが、この質問にふさわしい以上の作業が必要です。
UPDATE 2、3:
使用例:
const
MAX_PATH = 260;
SPOST_PATH = 1;
SP_COPY_DELETESOURCE = $0000001;
procedure InstallUsbDriver();
var
RequiredSize: DWORD;
DestinationInfFileName: String;
DestinationInfFileNameComponent: String;
begin
SetLength(DestinationInfFileName, MAX_PATH);
SetLength(DestinationInfFileNameComponent, MAX_PATH);
if not SetupCopyOEMInf(ExpandConstant('{app}\driver.inf'),
ExpandConstant('{app}'), SPOST_PATH, SP_COPY_DELETESOURCE,
DestinationInfFileName, MAX_PATH, RequiredSize,
DestinationInfFileNameComponent) then begin
MsgBox('Error installing USB driver: ' + SysErrorMessage(DLLGetLastError),
mbError, MB_OK);
CancelWithoutPrompt := True;
WizardForm.Close;
end;
end;