AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Migration D6-Projekt auf XE7

Ein Thema von ltbr · begonnen am 27. Mai 2015 · letzter Beitrag vom 31. Mai 2015
Antwort Antwort
ltbr

Registriert seit: 5. Feb 2007
3 Beiträge
 
Delphi XE7 Enterprise
 
#1

Migration D6-Projekt auf XE7

  Alt 27. Mai 2015, 16:12
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
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#2

AW: Migration D6-Projekt auf XE7

  Alt 27. Mai 2015, 19:51
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....
  Mit Zitat antworten Zitat
ltbr

Registriert seit: 5. Feb 2007
3 Beiträge
 
Delphi XE7 Enterprise
 
#3

AW: Migration D6-Projekt auf XE7

  Alt 28. Mai 2015, 09:50
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:
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.
die letzte Zeile in der Uses-Anweisung habe ich unter XE7 auskommentiert, unter D6 war die aktiv.

das folgende ist ein Auszug der PSvr_TLB:
Delphi-Quellcode:
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;
und noch was interessantes, die ServerDM wo im Initialization-Teil was ausgeführt wird
Delphi-Quellcode:
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.
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.

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:
[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"
Kann mir da jemand weiterhelfen?
Mir würden auch schon ein paar Schlagworte helfen, mit denen ich dann Googlen kann.

Vielen Dank schon mal
Alex
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#4

AW: Migration D6-Projekt auf XE7

  Alt 31. Mai 2015, 07:49
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.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz