Qui ci sono un sacco di routine ho scritto nel mio libary. Se si passa un file pdf come parametro a PrintUsingShell, è necessario stampare se è stato installato un programma Acrobat Reader (potrebbe funzionare anche con altri software PDF se si sono registrati nel registro).
PrintUsingShell(x);
procedure PrintUsingShell(psFileName :string);
var s : string;
i : integer;
begin
if not FileExists(psFileName)
then
Exit;
s := FindShellPrintCmd(ExtractFileExt(psFileName));
i := Pos('%1',s);
if i > 0
then begin
System.Delete(s,i,2);
System.Insert(psFileName,s,i);
Execute(s);
end;
end;
function FindShellCmd(psExtension:string;psCmd:string): string;
var r : TRegistry;
sName : string;
begin
psExtension := Trim(psExtension);
if psExtension = ''
then begin
Result := '';
Exit;
end;
psCmd := Trim(psCmd);
if psCmd = ''
then
psCmd := 'OPEN'
else
psCmd := UpperCase(psCmd);
if psExtension[1] <> '.'
then
psExtension := '.' + psExtension;
r := TRegistry.Create(KEY_READ);
try
r.RootKey := HKEY_LOCAL_MACHINE;
r.OpenKeyReadOnly('software\classes\' + psExtension);
sName := r.ReadString('');
r.CloseKey();
r.OpenKeyReadOnly('software\classes\' + sName + '\Shell\' + psCmd + '\Command');
Result := r.ReadString('');
r.CloseKey();
finally
FreeAndNil(r);
end;
end;
function FindShellOpenCmd(psExtension:string):string;
begin
Result := FindShellCmd(psExtension,'OPEN');
end;
function FindShellPrintCmd(psExtension:string):string;
begin
Result := FindShellCmd(psExtension,'PRINT');
end;
{$ifdef windows}
function LocalExecute(psExeName:string ; wait:boolean ; how:word):word;
var i : integer;
prog,parm:string;
msg:TMsg;
rc : word;
begin
i := pos(psExeName,' ');
if i = 0
then begin
prog := psExeName;
parm := '';
end
else begin
prog := copy(psExeName,1,i-1);
parm := copy(psExeName,i+1,255);
end;
if pos(prog,'.') <> 0
then
prog := prog + '.exe';
psExeName := prog + ' ' + parm + #0;
rc := WinExec(@psExeName[1] , how);
if wait
then begin
if (rc > 32)
then begin
repeat
if PeekMessage(Msg,0,0,0,PM_REMOVE)
then begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
until (GetModuleUsage(rc) = 0)
end;
end;
end; { LocalExecute }
{$endif}
{$ifdef win32}
function LocalExecute32(FileName:String; Wait:boolean; Visibility : integer;
lWaitFor:Cardinal=INFINITE):integer;
var zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes }
false, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) { pointer to PROCESS_INF }
then Result := -1
else begin
if Wait
then begin
Result := WaitforSingleObject(ProcessInfo.hProcess,lWaitFor);
GetExitCodeProcess(ProcessInfo.hProcess,LongWord(Result));
end;
end;
end;
{$endif}
function Execute(psExeName:string):integer;
begin
{$ifdef windows} result := LocalExecute(psExeName, false , SW_SHOW); {$endif}
{$ifdef win32} result := LocalExecute32(psExeName, false , SW_SHOW); {$endif}
end;
Nota: si prega di provare questi alla versione e sistema operativo Delphi (li ho sviluppato sotto Delphi 7 e li ha utilizzati in Windows XP).
Se si desidera stampare nativamente (senza Acrobat Reader installato, ma chi non ha installato Acrobat Reader al giorno d'oggi?) Si potrebbe prendere in considerazione il seguente set di componenti: Pdft print components from WpCubed.
UPDATE
Su richiesta ho aggiunto la funzione Execute dalla mia biblioteca ...
Thx! Non penso di poter usare le soluzioni di shell. Il programma su cui sto lavorando è un ERP personalizzato e la stampa deve essere eseguita sul lato client. Suppongo che la prima opzione richieda all'utente di installare anche Adobe Reader? Anche le librerie di terze parti sono molto utili, ma solo le prove sono ovviamente gratuite :) Dovrò parlare con il mio capo, ma abbiamo un budget limitato;) – Liezzzje
Per la soluzione ActiveX Adobe Reader non è richiesto pure, si. Ma quali sono le tue preoccupazioni riguardo alla soluzione Shellexecute? Probabilmente sarebbe il metodo più economico ... – Leo
Eccellente! Ricordarsi di aggiungere ShellApi, Windows alla clausola use. – JoeGalind