|
Antwort |
Registriert seit: 5. Feb 2007 3 Beiträge Delphi XE7 Enterprise |
#1
Hallo Community!
Ich hänge gerade in einem grösseren Migrationsprojekt: eine alte D6-Anwendung soll auf den aktuellen Stand gebracht werden (XE7). Es geht um eine ERP-Software, die lief mehrere Jahre auf Win2003-Servern und war wie gesagt unter D6 entwickelt. Nun soll alles auf den technisch neuesten Stand gebracht werden: die Anwendung soll unter Windows 8.1 bzw Win2012 Server laufen und auf Delphi XE7 migriert werden. Vieles habe ich bereits geschafft: Packages sind aktualisiert und installiert, Fremdkomponenten sind aktualisiert worden und die Hauptanwendung lässt sich schon mal compilieren. Leider ist damals (vor > 15 Jahren) entschieden worden ein Multi-Tier-Projekt daraus zu machen, ich habe also nun das Hauptprogramm das über ein Protokoll auf einen Applikationsserver zugreift. Der Applikationsserver (PSvr.exe) nutzt irgendwie die Midas.dll für die Kommunikation mit dem Hauptprogramm. Ich weiss, dass unter Win2003 die PSvr.exe einmalig mit dem Parameter /INSTALL gestartet werden musste um den Server zu registrieren (dadurch wurden irgendwelche Konfigurationen in die Registry geschrieben) Wenn danach die Hauptanwendung gestartet wurde, startete automatisch auch der Applikationsserver PSvr.exe, dieser übernahm die Kommunikation mit der Datenbank und lieferte der Hauptanwendung aufbereitete Daten bzw übernahm die Speicherung der Daten in der DB. Leider funktioniert nun unter Win8.1 das Starten des Applikationsservers mit dem Parameter /INSTALL nicht mehr, in die Registry wird nichts hineingeschrieben, dadurch kann die Hauptanwendung den Applikationsserver logischerweise nicht finden und starten. Es wird keinerlei Fehler angezeigt, im Eventlog steht nichts drin, auch mit Tools wie dem ProcessMonitor sehe ich nichts ungewöhliches. Leider fehlen mir für eine Recherche im Internet die passenden Schlagwörter, mit Suche nach Midas.dll oder MultiTier komme ich jedenfalls nicht weiter... Hat jemand von euch vielleicht den entscheidenden Hinweis auf Lager? Warum registriert sich der Applikationsserver nicht korrekt? Bei Bedarf kann ich natürlich auch Auszüge des Quellcodes liefern, sagt mir bitte was konkret ihr braucht Vielen Dank |
Zitat |
Registriert seit: 10. Apr 2006 Ort: Leverkusen 972 Beiträge Delphi 6 Professional |
#2
Hallo..
Hmm.. Also die Midas.dll gehört eigentlich zum ClientDataSet von Delphi 6, wenn man nicht die Routinen in die Exe hinein genommen hat (durch einfaches uses MidasLib..). Das mit /INSTALL sieht nach einer Installation eines Windows-Dienstes aus, wenn dem so ist, dann musst Du auf Vista und neuer den Aufruf als Administrator ausführen, sprich packe das 'PSvr.exe /INSTALL' in eine Batch-Datei und starte die mit 'Als Administrator ausführen' (musst natürlich auch ein Administrator sein!). Dann wird der Dienst installiert und trägt sich in die Reg ein . Zum Thema 'Windows 8.1 bzw Win2012 Server laufen': Alle unsere alten D6-Applikation laufen unter allen WIndows-Version ab XP bis 2012 oder gar 8.1... Ob eine Migration nach XE7 notwendig ist, lass ich mal dahingestellt.... |
Zitat |
Registriert seit: 5. Feb 2007 3 Beiträge Delphi XE7 Enterprise |
#3
Hallo und Danke für die Antwort!
die PSvr.exe ist definitiv kein Dienst, das mit dem "Als Administrator ausführen" hab ich auch schon versucht, leider ohne Erfolg. das alte D6-Projekt verwendet übrigens die BDE, die sollte im Zuge der Migration nach XE7 auch entfernt und durch moderne DB-Zugriffskomponenten ersetzt werden (UniDAC) Ich versuch noch ein paar Infos zu liefern, vielleicht hat ja noch jemand eine Idee: also das Hauptprogramm des Applikationsservers sieht so aus
Delphi-Quellcode:
die letzte Zeile in der Uses-Anweisung habe ich unter XE7 auskommentiert, unter D6 war die aktiv.
program PSvr;
uses Forms, SysUtils, Dialogs, ServerDlg in 'ServerDlg.pas' {dlgServer}, PSvr_TLB in 'PSvr_TLB.pas', ServerDM in 'ServerDM.pas' {PServer: TRemoteDataModule} {PServer: CoClass}, PSysDataUn in 'PSysDataUn.pas', PSrvDef in 'PSrvDef.pas', DocSrvFunctionsUn in 'DocSrvFunctionsUn.pas', PSettingsDlg in 'PSettingsDlg.pas' {dlgPSettings}; // Provider in 'C:\Programme\Borland\Delphi6\Source\Vcl\provider.pas'; {$R *.TLB} {$R *.RES} begin Application.ShowMainForm:=False; Application.Initialize; Application.CreateForm(TdlgServer, dlgServer); if ParamCount>0 then begin if (UpperCase(ParamStr(1))='/I') or (UpperCase(ParamStr(1))='/INSTALL') then Halt; end; Application.Run; end. das folgende ist ein Auszug der PSvr_TLB:
Delphi-Quellcode:
und noch was interessantes, die ServerDM wo im Initialization-Teil was ausgeführt wird
unit PSvr_TLB;
// ************************************************************************ // // WARNING // ------- // The types declared in this file were generated from data read from a // Type Library. If this type library is explicitly or indirectly (via // another type library referring to this type library) re-imported, or the // 'Refresh' command of the Type Library Editor activated while editing the // Type Library, the contents of this file will be regenerated and all // manual modifications will be lost. // ************************************************************************ // // PASTLWTR : $Revision: 1.130.1.0.1.0.1.6 $ // File generated on 23.01.2009 14:25:49 from Type Library described below. // ************************************************************************ // // Type Lib: D:\projects\PERP\program\PServer\PSvr.tlb (1) // LIBID: {B9A8DFF8-92C2-11D3-990E-00500401C404} // LCID: 0 // Helpfile: // DepndLst: // (1) v1.0 Midas, (C:\WINNT\system32\MIDAS.DLL) // (2) v2.0 stdole, (C:\WINNT\system32\stdole2.tlb) // (3) v4.0 StdVCL, (C:\WINNT\system32\stdvcl40.dll) // ************************************************************************ // {$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. {$WARN SYMBOL_PLATFORM OFF} {$WRITEABLECONST ON} {$VARPROPSETTER ON} interface uses Windows, ActiveX, Classes, Graphics, Midas, StdVCL, Variants; // *********************************************************************// // GUIDS declared in the TypeLibrary. Following prefixes are used: // Type Libraries : LIBID_xxxx // CoClasses : CLASS_xxxx // DISPInterfaces : DIID_xxxx // Non-DISP interfaces: IID_xxxx // *********************************************************************// const // TypeLibrary Major and minor versions PSvrMajorVersion = 1; PSvrMinorVersion = 0; LIBID_PSvr: TGUID = '{B9A8DFF8-92C2-11D3-990E-00500401C404}'; IID_IPServer: TGUID = '{F38C6372-3F3B-11D3-ADA5-006097B43693}'; CLASS_PServer: TGUID = '{F38C6374-3F3B-11D3-ADA5-006097B43693}'; type // *********************************************************************// // Forward declaration of types defined in TypeLibrary // *********************************************************************// IPServer = interface; IPServerDisp = dispinterface; // *********************************************************************// // Declaration of CoClasses defined in Type Library // (NOTE: Here we map each CoClass to its Default Interface) // *********************************************************************// PServer = IPServer; // *********************************************************************// // Interface: IPServer // Flags: (4416) Dual OleAutomation Dispatchable // GUID: {F38C6372-3F3B-11D3-ADA5-006097B43693} // *********************************************************************// IPServer = interface(IAppServer) ['{F38C6372-3F3B-11D3-ADA5-006097B43693}'] function SetDBParams(const Aliasname: WideString; const UserName: WideString; const Password: WideString; HoldConnection: WordBool; const ClientName: WideString; const ProgUser: WideString; ConnectType: Smallint; var AliveInterval: Integer): WordBool; safecall; .... .... .... end; // *********************************************************************// // DispIntf: IPServerDisp // Flags: (4416) Dual OleAutomation Dispatchable // GUID: {F38C6372-3F3B-11D3-ADA5-006097B43693} // *********************************************************************// IPServerDisp = dispinterface ['{F38C6372-3F3B-11D3-ADA5-006097B43693}'] function SetDBParams(const Aliasname: WideString; const UserName: WideString; const Password: WideString; HoldConnection: WordBool; const ClientName: WideString; const ProgUser: WideString; ConnectType: Smallint; var AliveInterval: Integer): WordBool; dispid 1; ... ... ... end; // *********************************************************************// // The Class CoPServer provides a Create and CreateRemote method to // create instances of the default interface IPServer exposed by // the CoClass PServer. The functions are intended to be used by // clients wishing to automate the CoClass objects exposed by the // server of this typelibrary. // *********************************************************************// CoPServer = class class function Create: IPServer; class function CreateRemote(const MachineName: string): IPServer; end; implementation uses ComObj; class function CoPServer.Create: IPServer; begin Result := CreateComObject(CLASS_PServer) as IPServer; end; class function CoPServer.CreateRemote(const MachineName: string): IPServer; begin Result := CreateRemoteComObject(MachineName, CLASS_PServer) as IPServer; end;
Delphi-Quellcode:
Soweit ich das sehe, ist das TComponentFactory.Create
das einzige das ausgeführt wird, wenn ich die Anwendung mit dem Paramter /INSTALL starte, also sollte hier die Registrierung erfolgen.
unit ServerDM;
interface uses Windows, Messages, Variants, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr, DBClient, PSvr_TLB, StdVcl, DBTables, Db, Uni, Provider, Midas, PSysdataUn, CSClientDataSet, ExtCtrls, DBAccess, MemDS; type TPServer = class(TRemoteDataModule, IPServer) ....; implementation uses {BDE,}ServerDlg,Dialogs,PSrvDef,DocSrvFunctionsUn; ... initialization TComponentFactory.Create(ComServer, TPServer, Class_PServer, ciMultiInstance, tmApartment); end. wenn die Anwendung unter D6 mit dem Parameter /INSTALL gestartet wird, legt sie in der Registry folgende Schlüssel an
Code:
[HKEY_CLASSES_ROOT\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}]
@="PServer Object" "AppID"="{F38C6374-3F3B-11D3-ADA5-006097B43693}" "Sockets"="1" "Web"="1" [HKEY_CLASSES_ROOT\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}\Implemented Categories] [HKEY_CLASSES_ROOT\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}\Implemented Categories\{13E85B3C-9508-11D2-AB63-00C04FA35CFA}] [HKEY_CLASSES_ROOT\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}\LocalServer32] @="C:\\PROGRA~1\\PROFIK~1.0\\PSvr.exe" [HKEY_CLASSES_ROOT\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}\ProgID] @="PSvr.PServer" [HKEY_CLASSES_ROOT\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}\TypeLib] @="{B9A8DFF8-92C2-11D3-990E-00500401C404}" [HKEY_CLASSES_ROOT\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}\Version] @="1.0" [HKEY_CLASSES_ROOT\TypeLib\{B9A8DFF8-92C2-11D3-990E-00500401C404}] [HKEY_CLASSES_ROOT\TypeLib\{B9A8DFF8-92C2-11D3-990E-00500401C404}\1.0] @="PSvr Library" [HKEY_CLASSES_ROOT\TypeLib\{B9A8DFF8-92C2-11D3-990E-00500401C404}\1.0\0] [HKEY_CLASSES_ROOT\TypeLib\{B9A8DFF8-92C2-11D3-990E-00500401C404}\1.0\0\win32] @="C:\\PROGRA~1\\PROFIK~1.0\\PSvr.exe" [HKEY_CLASSES_ROOT\TypeLib\{B9A8DFF8-92C2-11D3-990E-00500401C404}\1.0\FLAGS] @="0" [HKEY_CLASSES_ROOT\TypeLib\{B9A8DFF8-92C2-11D3-990E-00500401C404}\1.0\HELPDIR] @="C:\\PROGRA~1\\PROFIK~1.0\\" [HKEY_CLASSES_ROOT\PSvr.PServer] @="PServer Object" [HKEY_CLASSES_ROOT\PSvr.PServer\Clsid] @="{F38C6374-3F3B-11D3-ADA5-006097B43693}"
Code:
Kann mir da jemand weiterhelfen?
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{B9A8DFF8-92C2-11D3-990E-00500401C404}]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{B9A8DFF8-92C2-11D3-990E-00500401C404}\1.0] @="PSvr Library" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{B9A8DFF8-92C2-11D3-990E-00500401C404}\1.0\0] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{B9A8DFF8-92C2-11D3-990E-00500401C404}\1.0\0\win32] @="C:\\PROGRA~1\\PROFIK~1.0\\PSvr.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{B9A8DFF8-92C2-11D3-990E-00500401C404}\1.0\FLAGS] @="0" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{B9A8DFF8-92C2-11D3-990E-00500401C404}\1.0\HELPDIR] @="C:\\PROGRA~1\\PROFIK~1.0\\" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PSvr.PServer] @="PServer Object" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PSvr.PServer\Clsid] @="{F38C6374-3F3B-11D3-ADA5-006097B43693}" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}] @="PServer Object" "AppID"="{F38C6374-3F3B-11D3-ADA5-006097B43693}" "Sockets"="1" "Web"="1" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}\Implemented Categories] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}\Implemented Categories\{13E85B3C-9508-11D2-AB63-00C04FA35CFA}] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}\LocalServer32] @="C:\\PROGRA~1\\PROFIK~1.0\\PSvr.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}\ProgID] @="PSvr.PServer" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}\TypeLib] @="{B9A8DFF8-92C2-11D3-990E-00500401C404}" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{F38C6374-3F3B-11D3-ADA5-006097B43693}\Version] @="1.0" Mir würden auch schon ein paar Schlagworte helfen, mit denen ich dann Googlen kann. Vielen Dank schon mal Alex |
Zitat |
Registriert seit: 10. Apr 2006 Ort: Leverkusen 972 Beiträge Delphi 6 Professional |
#4
Vielleicht klappt ja doch alles und Du suchst nur an der falschen Stelle in der Registry..
Stichwort 32bit/64bit Applikation und Registry. Diverse Pfade einer 32bit App werden von einem 64bit Windows umgeleitet auf einen anderen Pfad, so das 64bit Apps die Reg-Einträge nicht unter dem original Pfad finden können. |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |