[Delphi] Program neběží korektně mimo IDE
Ahojte. Mám následující program (klidně ho sem plácnu celý, je to maličká utilitka):
program runreport;
{$APPTYPE CONSOLE}
uses
SysUtils, MConnect, ComObj, ActiveX;
var RepParam:String;
var dcom1: TDCOMConnection;
procedure VypisHelp();
begin
WriteLn ('Spouští report na vzdáleném serveru.');
WriteLn('');
WriteLn('runreport [/report] [název reportu]');
WriteLn('');
WriteLn('/report název reportu: spustí report "název reportu."');
WriteLn('/?: zobrazí tuto nápovedu');
end;
procedure CheckParam();
begin
if ParamStr(2)='' then WriteLn('Parametr je prázdný!')
else try
RepParam:=ParamStr(2);
CoInitialize(nil);
dcom1:=TDCOMConnection.Create(nil);
dcom1.ComputerName:='SRV02';
dcom1.LoginPrompt:=False;
dcom1.ServerGUID:='{57131FF5-58C4-4F1C-BDEF-F45A71C369A1}';
dcom1.ServerName:='MailResServer.clMailRes';
dcom1.Connected:=True;
dcom1.AppServer.GenReport(RepParam);
CoUninitialize;
WriteLn('Odesláno na server s parametrem' + ' ' + RepParam);
except
WriteLn ('Neco se posralo');
exit;
end;
end;
begin
if ParamStr(1) = '/?' then VypisHelp()
else if ParamStr(1)= '/report' then CheckParam()
else WriteLn ('Zadán nesprávný nebo prázdný parametr.');
end.
V IDE má nastavené parametry /report PARAMETR. Mačkám-li Shift-F7 a procházím-li skrz kód, program udělá co má a Delphi proti němu naprosto neprotestují.
Leč spuštěný z komandlajny (Windows 2003 Server, je to to samé PC) tento kód mezi try..except se neprovede (jak jsem zjistil zakomentováváním):
dcom1.Connected:=True;
dcom1.AppServer.GenReport(RepParam);
Prostě to nic neudělá. A teď babo raď Doteď jsem byl zvyklý, že moje chyby najde debugger, ale v tomhle případě vážně nevím, jak dál... "Programátor" jsem jen sváteční, takže čekám nějaké rozuzlení (nejen) od místních delphi gurus, JF a Rce
Neudělá to lautr nic, ani to nevypíše ten "WriteLn('Odesláno na server s parametrem' + ' ' + RepParam);"?
Vypíše to "něco se posralo", protože to připojení dcom klienta, tedy
dcom1.Connected:=True;
se neprovede (a logicky pak to následující volání rozhraní serveru).
Odesláno atd. to vypíše pouze, když ty dva zmíněné řádky zakomentuju, takže to má šanci doběhnout až tam.
Nejvíc mě vytáčí že v IDE to funguje
Aha! Tak to bude něco časově závislého, co se v runtime "rovnejma nohama" (z exe) nestihne a složí se to na chybu. Při krokování v IDE to projde, neb se to krokuje pomalu. Doporučuji na chvíli vyhodit (zakomentovat) to try--except aby bylo vidět, co to hlásí za chybu (protože chyba někde vypukla). Pak budeme moudřejší.
Vyřešeno! Jsem dement Tu komandlajnu jsem měl puštěnou několik dní a zapoměl jsem, že jsem ji pouštěl pod jiným uživatelem než ty Delphi. A samozřejmě ten uživatel pod kterým jsem to pouštěl neměl práva na aktivaci toho COM+ serveru. Program funguje jak má. A můžu jít spát
PS. i tak díky za pomoc, i když jsem mátl informacemi
No, neviem google o tej komponente najde len same blbosti, ale nemal by si pouzit dcom1.Open() ? a prip. potom testovat to "Connected"? (skus googlit najdes nejake diskusie o tom, alebo mas k tomu TDCOMConnection nejaky reference manual?).
Je mozne ze delphi ako aplikacia to uz ma otvorene alebo co, a ty nieco nerobis co uz urobilo delphi pre seba ako aplikaciu...
Alebo moze byt rozdiel medzi debug verziou a release verziou, skus vytvorit a spustit debug verziu (nastavenia projektu resp. linkera).
P.S. alebo to co pise Rce vyssie, skus to v debuggeri nekrokovat ale pustit to "go to cursor" alebo si nastav breakpointy a spust v delphi debbugeri go (po breakpoint), ci to vyleti do toho except ak to spustis rychlo...
dcom1.Open() a dcom1.Connected:=True by mělo (možná ) být rovnocenné. Connected by se testovat rozhodně mělo. TDCOMConnection realizuje jen spojení, problém bude v tom Serveru. Mám pocit, že se má zadávat buď GUI a nebo ServerName - ale nadbytečné zadání (v tomto případě) GUI asi na závadu nebude. Nejlépe je vyhodit ten try--except a uvidíme, co to hlásí za chybu.
//Edit: éééch, mezitím vyřešeno (patrně tou chybovou hláškou ). Tak hlavně, že to chodí. Dobrou noc, Vladimíre