Thema: Delphi Treiberinstallation

Einzelnen Beitrag anzeigen

Nuclear-Ping
(Gast)

n/a Beiträge
 
#5

Re: Treiberinstallation

  Alt 30. Aug 2007, 13:55
Great suggestions, thanks. But none of them work ...

Suggestion to separate file name and root path:
Delphi-Quellcode:
const
  infPath = '.\drivers\NT_2K_XP\lqr\';
  infFile = 'lqr_usb.inf';
var
  srcPath,
  srcFile: PChar;
begin
  GetMem (srcPath, Length (infPath) + 1);
  GetMem (srcFile, Length (infFile) + 1);
  StrCopy (srcPath, infPath);
  StrCopy (srcFile, infFile);
  if SetupInstallFile (
        nil,
        nil,
        srcFile,
        srcPath,
        nil,
        SP_COPY_SOURCE_ABSOLUTE,
        nil,
        nil) then
    showmessage ('OK')
  else showmessage ('Oh Oh ...');
  FreeMem (srcPath);
  FreeMem (srcFile);
end;
Suggestion to use SetupOpenInfFile: I get an AV when calling SetupOpenInfFile, Read of Adress 000...
I already tried several ways, without GetMem, with GetMem, without ZeroMemory, ...
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  infPath = '.\drivers\NT_2K_XP\lqr\';
  infFile = 'lqr_usb.inf';
var
  srcPath,
  srcFile,
  InfClass: PChar;
  Inf: HINF;
  ErrorLine: PUINT;
begin
  GetMem (InfClass, 32);
  ZeroMemory (InfClass, 32);
  GetMem (srcFile, Length (infPath + infFile) + 1);
  StrCopy (srcFile, infPath + infFile);
  showmessage (srcFile);
  Inf := SetupOpenInfFile (srcFile, InfClass, INF_STYLE_WIN4, ErrorLine);
  try
    if SetupInstallFile (
          Inf,
          nil,
          nil,
          nil,
          nil,
          SP_COPY_SOURCE_ABSOLUTE,
          nil,
          nil) then
      showmessage ('OK')
    else showmessage ('Failed');
  finally
    FreeMem (srcFile);
    FreeMem (InfClass);
    SetupCloseInfFile (Inf);
  end;
end;
[Edit]
Ich hab ne Lösung gefunden mit der DIFxAPI von MSDN!

Hab parallel zu dem Vorhaben mit SetupApi die difxapi.h nach Delphi übersetzt - soweit das meine Kenntnisse zuliesen - und scheinbar klappt das.

Die Header-Datei:
http://www.108bits.de/private/files/sources/difxapi.zip

Der Code:
Delphi-Quellcode:
const
  lqrInfFile: String = '.\drivers\NT_2K_XP\lqr\lqr_usb.inf';
  ftdiInfFile1: String = '.\drivers\NT_2K_XP\rs232\FTDIPORT.INF';
  ftdiInfFile2: String = '.\drivers\NT_2K_XP\rs232\FTDIBUS.INF';
var
  NR: Boolean;
  Info: PCINSTALLERINFO_A;
begin
  GetMem (Info, 128);
  Info.pApplicationId := 'AppGUID';
  Info.pDisplayName := 'ApplicationDisplayName';
  Info.pProductName := 'YourProductName';
  Info.pMfgName := 'ManufacturerName';
  DriverPackageInstall (PChar (ftdiInfFile1), DRIVER_PACKAGE_FORCE or DRIVER_PACKAGE_LEGACY_MODE, Info, NR);
  FreeMem (Info);

{...}
end;
Das funzt. Kurze Sanduhr, Treiber ist installiert.

Allerdings hab ich hier bei der Übersetzung der Header-Datei wohl auch bissl geschlampt. Wenn ich Info nil übergebe (was bei MSDN ok ist), bekomme ich nach der Funktion eine AV, der Treiber wird aber trotzdem installiert.
Auch funktioniert "DriverPackagePreinstall" scheinbar nicht, da dort gleich mal garnix passiert, weder Sanduhr noch Treiberinstallation.
Bin halt kein C'ler ... Wer also Fehler findet darf sie gern korrigieren und der Community 'ne optimierte Übersetzung zur Verfügung stellen.
[/Edit]
  Mit Zitat antworten Zitat