Il y a quelques années, j'ai rencontré le projet FreePascal et Lazarus.
Si FreePascal était déjà capable de compiler du code Delphi, il restait encore un long chemin à parcourir.
Lazarus de son côté devait encore fortement évoluer.
Ce matin, je suis tombé sur cette vidéo (certes en Allemand) qui montre comment installer FreePascal + Lazarus sur Ubunu (vraiment simple puisque disponible depuis la logithèque).
Voici la vidéo, juste pour vous faire une petite idée:
L'IDE est visible en fin de vidéo.
Affichage des articles dont le libellé est Delphi. Afficher tous les articles
Affichage des articles dont le libellé est Delphi. Afficher tous les articles
mardi 10 avril 2012
mercredi 6 octobre 2010
Embarcadero RAD Studio XE
Digne successeur de Delphi Studio 2010 (qui est lui fusionné dans Visual Studio), RAD Studio XE revient sur le devant de la scène avec un environnement de développement propre.
En autre, on retrouve dans RAD Studio XE les languages suivants:
En autre, on retrouve dans RAD Studio XE les languages suivants:
- Environnement de développement propre.
- C++ Builder,
- Delphi,
- Prism,
- Delphi for PHP
- Une intégration avec différents systèmes de SubVersion.
- Une généralisation du module de modeling plus convivial et supportant les diagrammes de séquence (visiblement la grande nouveauté)
vendredi 21 mai 2010
InterProcess communication - les messages windows
Parce qu'un petit rappel ne fait jamais de mal.
Parmi les procédés d'intercommunication, il y a l'envoi (et la capture) de message Windows.
Les messages Windows étant destiné à une fenêtre particulière (identifié par un handle) et composé d'une structure relativement simple (un WParam et un LParam qui sont des valeurs numériques).
Windows dispose déjà d'un grand nombre de messages, mais pour des besoins logiciels il peut être nécessaire de définir ses propres messages applicatifs.
Envoi de message personnalisés
Un message est identifier à l'aide d'une valeur numérique unique dans l'OS.
Autrement dit, les messages de manipulation des fenêtre est identique (même numéro) quel que soit l'application.
Il est également possible de définir ses propre messages utilisateurs.
Soit en désignant une valeur numérique arbitraire (WM_MON_MESSAGE_A_MOI : integer = WM_USER + 1;),
Soit en demandant au système d'exploitation de générer un numéro de message unique ( RegisterWindowMessage('WM_MESSAGE_ENVOYEUR'); )
Cet article présente un exemple d'implémentation de message personnalisé en Delphi.
WM_CopyData
Parmi tous les messages existant, il y WM_CopyData.
Ce message particulier (accompagné d'une structure COPYDATASTRUCT) permet de transmettre des blocs de données entre applications (par l'intermédaire d'envoi de pointer/référence vers un buffer).
Plus d'information
Parmi les procédés d'intercommunication, il y a l'envoi (et la capture) de message Windows.
Les messages Windows étant destiné à une fenêtre particulière (identifié par un handle) et composé d'une structure relativement simple (un WParam et un LParam qui sont des valeurs numériques).
Windows dispose déjà d'un grand nombre de messages, mais pour des besoins logiciels il peut être nécessaire de définir ses propres messages applicatifs.
Envoi de message personnalisés
Un message est identifier à l'aide d'une valeur numérique unique dans l'OS.
Autrement dit, les messages de manipulation des fenêtre est identique (même numéro) quel que soit l'application.
Il est également possible de définir ses propre messages utilisateurs.
Soit en désignant une valeur numérique arbitraire (WM_MON_MESSAGE_A_MOI : integer = WM_USER + 1;),
Soit en demandant au système d'exploitation de générer un numéro de message unique ( RegisterWindowMessage('WM_MESSAGE_ENVOYEUR'); )
Cet article présente un exemple d'implémentation de message personnalisé en Delphi.
WM_CopyData
Parmi tous les messages existant, il y WM_CopyData.
Ce message particulier (accompagné d'une structure COPYDATASTRUCT) permet de transmettre des blocs de données entre applications (par l'intermédaire d'envoi de pointer/référence vers un buffer).
Plus d'information
lundi 2 novembre 2009
Injection de code en Delphi
Introduction
Une méthode connue sous le nom de détour (par Microsoft) permet d'injecter un code de quelques bytes en assembleur devant les appels de fonctions.
Il s'agit en gros 5 bytes (1 byte pour le JMP et 4 bytes pour l'adresse) permettant de faire un saut vers un tremplin (un bout de code situé plus loin).
Ce dernier effectuant des opérations complémentaires (le code injecté) avant d'appeler la fonction initialement appelée (le saut de tremplin lui-même).
En agissant de la sorte, il est possible d'intercepter tous les appels (si l'on en connais l'adresse de la fonction).
Il est également possible de monitorer les API windows.
Cet article traite également des méthodes DLL injection.
Faire une recherche google sur "Api Détour".
AsmProfiler
Il y a quelques temps André Mussche a développé en Delphi un profiler nommé AsmProfiler . AsmProfiler est librement disponible sur Google Code.
AsmProfiler utilise méthode spéciale détournant les appels de fonctions pour insérer du code de monitoring avant l'appel réel de la fonction (méthode appelé "Détour"). Il est ainsi possible d'intercepter n'importe quel appel si l'adresse de la fonction est connue.
Il est par exemple possible d'utiliser cette méthode pour monitorer les appels à l'API WriteProcessMemory et par conséquent d'identifier les processus modifiant le code applicatif à la volée (comme les virus informatiques par exemple).
Le procédé de "detouring" du projet AsmProfiler est implémenté dans la unit KOLDetours.pas.
Une méthode connue sous le nom de détour (par Microsoft) permet d'injecter un code de quelques bytes en assembleur devant les appels de fonctions.
Il s'agit en gros 5 bytes (1 byte pour le JMP et 4 bytes pour l'adresse) permettant de faire un saut vers un tremplin (un bout de code situé plus loin).
Ce dernier effectuant des opérations complémentaires (le code injecté) avant d'appeler la fonction initialement appelée (le saut de tremplin lui-même).
En agissant de la sorte, il est possible d'intercepter tous les appels (si l'on en connais l'adresse de la fonction).
Il est également possible de monitorer les API windows.
Pour en savoir plus:
Pour en apprendre plus, aller lire l'article "API Hooking with MS Detours" sur CodeProject.Cet article traite également des méthodes DLL injection.
Faire une recherche google sur "Api Détour".
AsmProfiler
Il y a quelques temps André Mussche a développé en Delphi un profiler nommé AsmProfiler . AsmProfiler est librement disponible sur Google Code.
AsmProfiler utilise méthode spéciale détournant les appels de fonctions pour insérer du code de monitoring avant l'appel réel de la fonction (méthode appelé "Détour"). Il est ainsi possible d'intercepter n'importe quel appel si l'adresse de la fonction est connue.
Il est par exemple possible d'utiliser cette méthode pour monitorer les appels à l'API WriteProcessMemory et par conséquent d'identifier les processus modifiant le code applicatif à la volée (comme les virus informatiques par exemple).
Le procédé de "detouring" du projet AsmProfiler est implémenté dans la unit KOLDetours.pas.
DLL injection
Voici deux autres méthodes/exemples (issues du projet AsmProfiler) démontrant la méthode de "DLL Injection".mercredi 28 octobre 2009
Embedded File System en Delphi
Les articles "Writing an embedded file system" et "GpStructuredStorage internals" de Primoz Gabrijelcic (créateur de GpTools et GpSynch) explique comment implémenter, à l'aide de Delphi, un système de fichier avec répertoires dans un seul fichier physique.
L'implémentation de GpStructuredStorage tire encore une fois parti des avantages offerts par l'implémentation d'interface. Le code utilisant GpStructuredStorage est d'une grande lisibilité.
L'utilisation de cette technique permet par exemple:
Télécharger les sources de GpStructuredStorage.
L'implémentation de GpStructuredStorage tire encore une fois parti des avantages offerts par l'implémentation d'interface. Le code utilisant GpStructuredStorage est d'une grande lisibilité.
L'utilisation de cette technique permet par exemple:
- De maintenir les nombreuses données de configurations d'un logiciel dans un seul fichier physique.
- D'organiser des fichiers de données les plus variés au sein d'un seul fichier physique.
- Mettre en place une pseudo base de donnée (basée sur un système de fichier).
Télécharger les sources de GpStructuredStorage.
jeudi 8 octobre 2009
Delphi 2009 Handbook
Marco Cantù propose son ouvrage "Delphi 2009 Handbook" sur Lulu.com (aussi disponible via Amazon).
Ce livre consacre une partie de son contenu à l'implémentation Unicode maintenant devenu le type par défaut des strings et chars (les anciens types 8 bits étant devenu AnsiChar et AnsiString).
Pour information, le standard de transformation en Delphi est UTF-16.
Hormis le côté Unicode, ce livre se consacre également aux points suivants:
Plus d'information ici sur le site de Marco Cantù.
Note:
Le site de Marco Cantù référence également un article intéressant comparant les langages OOP.
Ce livre consacre une partie de son contenu à l'implémentation Unicode maintenant devenu le type par défaut des strings et chars (les anciens types 8 bits étant devenu AnsiChar et AnsiString).
Pour information, le standard de transformation en Delphi est UTF-16.
Hormis le côté Unicode, ce livre se consacre également aux points suivants:
- Type génériques
- Méthodes anonymes.
- Support COM en Delphi 2009.
- DataSnap 2009
- DBExpress
Plus d'information ici sur le site de Marco Cantù.
Note:
Le site de Marco Cantù référence également un article intéressant comparant les langages OOP.
Libellés :
Delphi,
Développement,
Lecture
mercredi 7 octobre 2009
Enumérer les méthodes d'une classe (en Run-Time)
L'article "Class RTTI" offre une introduction intéressante à l'utilisation des informations RTTI, HostScripting et de l'invocation automatique des méthodes depuis les WebSnap.
L'utilisation de {$METHODINFO ON} avec l'unité DetailedRtti.pas de David Glassborrow permet d'envisager l'extraction et l'utilisation des informations RTTI en RunTime pour faire des appels dynamiques.
Fournit sous forme de Class Helper et Record Helper, DetailedRtti.pas permet, par exemple, d'extraire la définition des méthodes/fields/etc d'une classe.
L'exemple ci-dessous énumère toutes les méthodes d'un object.
L'énumération des méthodes peuvent s'avérée utile lors de l'invocation sur à la volée (par exemple à l'aide de MethodAddress).
L'utilisation de {$METHODINFO ON} avec l'unité DetailedRtti.pas de David Glassborrow permet d'envisager l'extraction et l'utilisation des informations RTTI en RunTime pour faire des appels dynamiques.
Fournit sous forme de Class Helper et Record Helper, DetailedRtti.pas permet, par exemple, d'extraire la définition des méthodes/fields/etc d'une classe.
L'exemple ci-dessous énumère toutes les méthodes d'un object.
type
{$METHODINFO ON}
TFRM_Main = class(TForm)
SBB_Button1: TButton;
...
procedure TFRM_Main.Button1Click(Sender: TObject);
begin
Log( self.RTTIMethodsAsString );
end;
L'énumération des méthodes peuvent s'avérée utile lors de l'invocation sur à la volée (par exemple à l'aide de MethodAddress).
type TTestProc = procedure of object;
{$METHODINFO ON}
TForm1 = class(TForm)
SBB_DoTesting: TButton;
...
published
procedure Proc_TestMe;
procedure Proc_TestMeAlso;
end;
...
procedure TForm1.RunThis(aProcedureName: String);
var
pProc : TTestProc;
begin
ShowInfo( 'Executer la méthode '+aProcedureName );
TMethod(pProc).Data := Self;
TMethod(pProc).Code := MethodAddress( 'proc_'+aProcedureName);
try
if not Assigned(TMethod(pProc).Code) then
raise Exception.Create( 'Failed to locate test "proc_'+aProcedureName+'" method address' );
pProc();
except
on e:Exception do
ShowError( E.Message+' ('+E.ClassName+')' );
end;
end;
...
procedure TForm1.SBB_DoTestingClick(Sender: TObject);
begin
// Exemple d'appel dynamique (à partir du nom de la méthode)
RunThis( 'TestMe' );
RunThis( 'TestMeAlso' );
end;
...
mardi 6 octobre 2009
Inclure une DLL dans les ressource d'un logiciel
Voici une recette de cuisine trouvée sur LinkedIn permettant d'inclure une DLL directement dans les ressources d'un éxécutable.
1. Inclure la DLL dans une RAW section du fichier ressource. Ainsi, il sera linker dans l'exe au moment de la compilation.
2a) Ajouter un bout code au programme qui extrait la DLL des ressources et la stocker sur le disque avant de la charger avec un loadLibrary.
2b) Une autre option est de copier directement en mémoire la DLL disponible en ressource . Ensuite créer des liens dynamiques permettant au programme d'appeler les procédures de la DLL (demande un effort de programmation plus poussé).
Le composant TFakeDll (disponible sur uinC/Underground INformation Center) permet d'inclure des DLL en ressources.
Bien qu'ils datent un peu, uinC contient également d'autre code sources Delphi comme des KeyLogger, Password Cracker, etc... toujours intéressant pour assouvir sa curiosité.
1. Inclure la DLL dans une RAW section du fichier ressource. Ainsi, il sera linker dans l'exe au moment de la compilation.
2a) Ajouter un bout code au programme qui extrait la DLL des ressources et la stocker sur le disque avant de la charger avec un loadLibrary.
2b) Une autre option est de copier directement en mémoire la DLL disponible en ressource . Ensuite créer des liens dynamiques permettant au programme d'appeler les procédures de la DLL (demande un effort de programmation plus poussé).
Le composant TFakeDll (disponible sur uinC/Underground INformation Center) permet d'inclure des DLL en ressources.
Bien qu'ils datent un peu, uinC contient également d'autre code sources Delphi comme des KeyLogger, Password Cracker, etc... toujours intéressant pour assouvir sa curiosité.
mardi 22 septembre 2009
Programmation et éléctronique - MikroElectronika
Programmation et électronique
Voici une liste des publications de Patrick Gueulle, ce dernier écrivant des ouvrages orientés programmation et électronique programmable.
Parmi les titres, l'on retrouve:
Je viens également de découvrir le "BIGPIC5 Development Board" de MikroElektronika.
Le genre de matériel éducatif a faire pâlir! (port RS232, USB, Display
affichage graphique + écran tactile, Display LCD, Slot pour carte mémoire SD, thermomètre digital, convertisseurs divers, horloge, pont de communication pour autre micro-controleur, affichage des états via LED, control via bouton, connecteurs IDC , etc)
MikroElektronika propose belle gamme de "Development Board", de publications et même un magazine.
Le plus surprenant a été d'apprendre que le compilateur mikroC PRO 8051 soit compilé avec Delphi!(source: The Public Delphi Wiki)
A noter qu'il existe également un microBasic et mikroPascal.
Voici une liste des publications de Patrick Gueulle, ce dernier écrivant des ouvrages orientés programmation et électronique programmable.
Parmi les titres, l'on retrouve:
- Composants électroniques programmables sur PC (Dunod, 05/2005)
- Logiciels PC pour l'électronique (Dunod, 04/2001)
- Montages à composants programmables (Dunod, 04/2000)
- Instrumentation virtuelle pour PC (Dunod, 05/1998)
- Plus loin avec les cartes à puces (Dunod, 03/2004)
- Cartes à puces - Initialisation et applications (Dunod, 08/2001)
Je viens également de découvrir le "BIGPIC5 Development Board" de MikroElektronika.
Le genre de matériel éducatif a faire pâlir! (port RS232, USB, Display
affichage graphique + écran tactile, Display LCD, Slot pour carte mémoire SD, thermomètre digital, convertisseurs divers, horloge, pont de communication pour autre micro-controleur, affichage des états via LED, control via bouton, connecteurs IDC , etc)
MikroElektronika propose belle gamme de "Development Board", de publications et même un magazine.
Le plus surprenant a été d'apprendre que le compilateur mikroC PRO 8051 soit compilé avec Delphi!(source: The Public Delphi Wiki)
A noter qu'il existe également un microBasic et mikroPascal.
EasyPIC5 development system - product of MikroElektronika
Libellés :
Delphi,
Développement,
Lecture
mardi 28 juillet 2009
OmniThread Library
La version d'OmniThread Library 1.01 est enfin disponible.
Cette librairie permet décrire des threads en Delphi à la manière du Langage C#.
Ceux ayant codés des threads en Delphi et en C# comprendrons immédiatement l'intérêt d'OmniThread.
OmniThread dispose également d'un excellent processus de communication basé sur une API bien pensée.
Cette librairie permet décrire des threads en Delphi à la manière du Langage C#.
Ceux ayant codés des threads en Delphi et en C# comprendrons immédiatement l'intérêt d'OmniThread.
OmniThread dispose également d'un excellent processus de communication basé sur une API bien pensée.
lundi 6 avril 2009
Firebug - Debugger pour Firefox
FireBug est un debuggeur JavaScript excessivement riche.
Par ailleurs, ce n'est pas la première fois que j'en entends parler.
Cette fois ci, je peux même relayer un slide provenant d'OpenJS.

Son seul désavantage est d'être un peu lourd et donc de ralentir FireFox.
Pour plus d'information, voir la page d'accueil de FireBug, les nombreuses fonctionnalités y sont décrites.
Pour installer FireBug sur FireFox 3.0.
Source: cet article sur OpenJS.
Par ailleurs, ce n'est pas la première fois que j'en entends parler.
Cette fois ci, je peux même relayer un slide provenant d'OpenJS.
Son seul désavantage est d'être un peu lourd et donc de ralentir FireFox.
Pour plus d'information, voir la page d'accueil de FireBug, les nombreuses fonctionnalités y sont décrites.
Pour installer FireBug sur FireFox 3.0.
Source: cet article sur OpenJS.
vendredi 3 avril 2009
Fluent Interface - Xml Builder
Juste queqlue petits mots pour relater une méthode de programmation à mon sens bien utile.
Cette méthode s'appelle Fluent Interface programming.
En gros, le but est de créer une interface de manipulation IConfigurationFluent dont chacune des fonctions retourne une référence vers cette interface.
Il est ainsi possible d'appliquer, à la chaine, des appels aux méthodes. Cela s'avère bien pratique lorsque l'on manipule des informations.
Voici, ci-dessous, deux exemples en C# (un avec une interface Fluent, l'autre sans). Il n'est pas bien difficile d'évaluer l'élégance de programmation de l'interface Fluent.
En autre, l'auteur de ce billet (qui n'est autre que Primoz Gabrijelcic, le créateur de GpSynch) a utilisé cette méthode de programmation pour créer un objet Xml Builder.
Ainsi construite sur l'interface IGpFluentXmlBuilder, la classe de Primoz permet de créer un document XML aussi facilement que ça:
Pour avoir moi-même écrit des routines de manipulation XML, je trouve cette approche très séduisante.
J'encourage vivement la lecture de son article.
Cette méthode s'appelle Fluent Interface programming.
En gros, le but est de créer une interface de manipulation IConfigurationFluent dont chacune des fonctions retourne une référence vers cette interface.
Il est ainsi possible d'appliquer, à la chaine, des appels aux méthodes. Cela s'avère bien pratique lorsque l'on manipule des informations.
Voici, ci-dessous, deux exemples en C# (un avec une interface Fluent, l'autre sans). Il n'est pas bien difficile d'évaluer l'élégance de programmation de l'interface Fluent.
public static void Main(string[] args)
{
//Exemple standard - Sans interface Fluent
IConfiguration config = new Configuration();
config.SetColor("blue");
config.SetHeight(1);
config.SetLength(2);
config.SetDepth(3);
//Exemple Utilisant l'interface Fluent
IConfigurationFluent config =
new ConfigurationFluent().SetColor("blue")
.SetHeight(1)
.SetLength(2)
.SetDepth(3);
}
En autre, l'auteur de ce billet (qui n'est autre que Primoz Gabrijelcic, le créateur de GpSynch) a utilisé cette méthode de programmation pour créer un objet Xml Builder.
Ainsi construite sur l'interface IGpFluentXmlBuilder, la classe de Primoz permet de créer un document XML aussi facilement que ça:
xmlWsdl := CreateFluentXml
.AddProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"')
.AddChild('definitions')
['xmlns', 'http://schemas.xmlsoap.org/wsdl/']
['xmlns:xs', 'http://www.w3.org/2001/XMLSchema']
['xmlns:soap', 'http://schemas.xmlsoap.org/wsdl/soap/']
['xmlns:soapenc', 'http://schemas.xmlsoap.org/soap/encoding/']
['xmlns:mime', 'http://schemas.xmlsoap.org/wsdl/mime/']
['name', serviceName]
['xmlns:ns1', 'urn:' + intfName]
['xmlns:fs', 'http://fab-online.com/soap/']
['targetNamespace', 'http://fab-online.com/soap/']
.AddChild('message')['name', 'fs:' + baseName + 'Request'].Anchor(nodeRequest)
.AddSibling('message')['name', 'fs:' + baseName + 'Response'].Anchor(nodeResponse)
.AddSibling('portType')['name', baseName]
.Here
.AddChild('operation')['name', baseName]
.AddChild('input')['message', 'fs:' + baseName + 'Request']
.AddSibling('output')['message', 'fs:' + baseName + 'Response']
.Back
.AddSibling('binding')
.Here
['name', bindingName]
['type', 'fs:' + intfName]
.AddChild('soap:binding')
['style', 'rpc']
['transport', 'http://schemas.xmlsoap.og/soap/http']
.AddChild('operation')['name', baseName]
.AddChild('soap:operation')
['soapAction', 'urn:' + baseName]
['style', 'rpc']
.AddSibling('input')
.AddChild('soap:body')
['use', 'encoded']
['encodingStyle', 'http://schemas.xmlsoap.org/soap/encoding/']
['namespace', 'urn:' + intfName + '-' + baseName]
.Parent
.AddSibling('output')
.AddChild('soap:body')
['use', 'encoded']
['encodingStyle', 'http://schemas.xmlsoap.org/soap/encoding/']
['namespace', 'urn:' + intfName + '-' + baseName]
.Back
.AddSibling('service')['name', serviceName]
.AddChild('port')
['name', portName]
['binding', 'fs:' + bindingName]
.AddChild('soap:address')['location', serviceLocation];Pour avoir moi-même écrit des routines de manipulation XML, je trouve cette approche très séduisante.
J'encourage vivement la lecture de son article.
vendredi 27 février 2009
Embedded Web Browser
EmbeddedWB est une autre suite de composants gratuits et franchement utiles (du moins pour les développeurs ayant besoin d'interagir avec Internet Explorer de Microsoft).
Au risque de lever des critiques, il faut reconnaitre que malgré ses défauts, Internet Explorer présente un avantage non négligeable pour les développeurs lorsqu'il est nécessaire afficher des documents de type "WEB" (Xml, Html avec un contenu riche) sur les plateformes Windows.
En plus d'étendre les fonctionnalités du composant TWebBrowser (composant visuel englobant Internet Explorer), EmbeddedWB se présente comme une suite idéale pour controler et manipuler de fond en comble les fonctionalités d'Internet Explorer.
Note:
Le composant TWebBrowser est disponible en version "très limitée" dès l'installation de CodeGear/Delphi.
Le package TEmbeddedWB de Bsalsa contient une nouvelle version nettement plus complète de ce composant.
Merci à la société Bsalsa :-)
Au risque de lever des critiques, il faut reconnaitre que malgré ses défauts, Internet Explorer présente un avantage non négligeable pour les développeurs lorsqu'il est nécessaire afficher des documents de type "WEB" (Xml, Html avec un contenu riche) sur les plateformes Windows.
En plus d'étendre les fonctionnalités du composant TWebBrowser (composant visuel englobant Internet Explorer), EmbeddedWB se présente comme une suite idéale pour controler et manipuler de fond en comble les fonctionalités d'Internet Explorer.
Note:
Le composant TWebBrowser est disponible en version "très limitée" dès l'installation de CodeGear/Delphi.
Le package TEmbeddedWB de Bsalsa contient une nouvelle version nettement plus complète de ce composant.
Merci à la société Bsalsa :-)
jeudi 26 février 2009
Jedi API
Cela doit maintenant bien faire une décennie que j'utilise du code "open source" issue des différents projets Jedi.
A bien des égards, la stabilité et la qualité des outils et librairies JEDI vont bien au-delà de la plupart des produits commerciaux.
Voici donc une petite mise en lumière de la Jedi Api, une vaste librairie pour développeurs Delphi.
Le but du project JEDI Api est de fournir une conversion, aussi complete que possible, des headers du Platform SDK de Windows.
Le projet est axé sur les éléments suivants:
Quelques liens utiles:
A bien des égards, la stabilité et la qualité des outils et librairies JEDI vont bien au-delà de la plupart des produits commerciaux.
Voici donc une petite mise en lumière de la Jedi Api, une vaste librairie pour développeurs Delphi.
Le but du project JEDI Api est de fournir une conversion, aussi complete que possible, des headers du Platform SDK de Windows.
Le projet est axé sur les éléments suivants:
- JWAPI: JEDI API Windows Headers
Voir aussi le blog associé.
- JWSCL: JEDI Windows Security Library
Voir aussi le blog. - NTAPI: NT Native API
Inclus toutes les fonctions exportées par NTDLL.DLL. Ces dernières étant plus ou moins documentés il est donc difficile de garantir que les déclarations soient toujours correctes et fonctionnelles sur tous les systems de NT4.0 a Vista. - SCAPI: Setup & Config Manager API
Interface de programmation gère les installations/désinstallations matérielles (ainsi que les fonctionnalités annexes). - win32api: Win32 API
Contient une très gros subset des headers disponibles dans le Platform SDK fournit par Microsoft.
Cette librairie est issue du laborieux travail de Marcel Van Brakel qui a bien malheureusement cessé ses activités dans la JCL API.
Quelques liens utiles:
- Blog de la JEDI WSCL
- Blog de la JEDI API
- Liens vers le projet Source Forge
mercredi 25 février 2009
Configurer IIS pour débogger des ISAPI Delphi
Débogger une DLL ISAPI avec Delphi 2007 et IIS n'est pas si simple que cela.
La solution proposée par CodeGear est certe élégante mais loin d'être pratique à mettre en oeuvre lorsque l'application se compose d'une vingtaine de DLLs migrées depuis Delphi 5.
C'était pour nous une situation bien épineuse à laquelle il a fallut un temps certains avant d'y apporter une réponse efficace.
Après de longue tribulations sur le Net, une solution fut trouvée chez XmlRad.com (grand merci!).
Ni une, ni deux, nous l'avons archivé.
Voici qu'est maintenant venu le temps de sortir notre petit trésor de sa grotte.
Voici donc liens vers l'article d'origine sur XmlRad.Com.
Ce dernier explique clairement comment configurer IIS pour débogger des DLL Isapi depuis Delphi 2007.
J'ai également une copie de ce dernier au format mht (Internet Explorer seulement).
L'article en question fait également référence à deux fichiers modifiant la registry.
Ces derniers sont disponibles dans l'archive iis-regfiles.zip .
Finallement, il faut égalment savoir que l'activation des BreakPoints dans une DLL isapi nécessite une configuration particulière du projet Delphi. Ce point est précisément abordé dans cet autre billet.
La solution proposée par CodeGear est certe élégante mais loin d'être pratique à mettre en oeuvre lorsque l'application se compose d'une vingtaine de DLLs migrées depuis Delphi 5.
C'était pour nous une situation bien épineuse à laquelle il a fallut un temps certains avant d'y apporter une réponse efficace.
Après de longue tribulations sur le Net, une solution fut trouvée chez XmlRad.com (grand merci!).
Ni une, ni deux, nous l'avons archivé.
Voici qu'est maintenant venu le temps de sortir notre petit trésor de sa grotte.
Voici donc liens vers l'article d'origine sur XmlRad.Com.
Ce dernier explique clairement comment configurer IIS pour débogger des DLL Isapi depuis Delphi 2007.
J'ai également une copie de ce dernier au format mht (Internet Explorer seulement).
L'article en question fait également référence à deux fichiers modifiant la registry.
Ces derniers sont disponibles dans l'archive iis-regfiles.zip .
Finallement, il faut égalment savoir que l'activation des BreakPoints dans une DLL isapi nécessite une configuration particulière du projet Delphi. Ce point est précisément abordé dans cet autre billet.
mercredi 28 janvier 2009
Free Pascal et Lazarus
En tant que développeur Delphi, c'est toujours avec une certaines curiosité que je m'attarde sur Lazarus.
C'est un peu par hazard que je suis revenu faire un tour sur le site officiel... l'ocassion d'écrire un petit billet pour mémoire.
Qu'est ce que Lazarus
Lazarus est une librairie de classes pour FreePascal qui émulent Delphi. Free Pascal est un compilateur sous license GPL fonctionnant sous Linux, Win32, OS/2, 68K et plus encore. Free Pascal a été conçu pour être capable de comprendre et compiler la syntaxe Orienté Object de Delphi.. Lazarus est la piece manquante du puzzle perrmettant de développer des logiciels Delphi pour différentes plateformes. A l'opposé du principe de Java "coder & compiler une fois, exécuté partout", Lazarus et Free Pascal opte pour l'approche "coder une fois, compilable partout". Puisque le même compilateur est disponible sur toutes les plateformes, cela signifie qu'il n'est pas nécessaire de modifier le code pour produire 'exactement' la même application pour différentes plateforme.
Quelle GUI est utilisé? Quel type de Widget?
C'est la partie la plus achevée. Lazarus a été développé pour être totalement et completement indépendant des API. Une fois le code écrit, la compiler link ce dernier aux APIs des widget que vous avez choisi. Si vous voulez utiliser GTK+ ou encore être Gnome compliant... pas de problème. Aussi longtemps que le code d'interfacage existe pour les widgets que vous utiliser... vous pouvez les utiliser (link). S'il n'est pas disponible, vous pouvez l'écrire.
Par exemple. Disons que vous créez un produit pour Windows utilisant les widgets standards de Windows. Et bien maintenant, vous pouvez créer une version Linux.
Premièrement, vous décidez quel est le set de widgets que vous voulez utiliser (par exemple gtk+).
Vous copier votre code sur une machine de développement Linux, vous compilez et linkez ce dernier avec l'interfacage Gtk+ (gtk+ interface unit).
Voila comment vous venez juste de créer une version Linux d'un produit Windows sans coding addtitionnel.
At ce state le Team Lazarus utilise gtk+ comme widget d'origine... mais l'équipe travaille actuellement sur Qt et les API Win32. Des que Lazarus atteindra la version 1.0, les développeurs seront capable de créder/développer les unités d'interface pour attacher la LCL (Lazarus Component Libraries) a d'autres ensembles de widget.
Est-ce un environnement RAD comme Delphi?
Oui... cependant, il n'est pas encore complet. Certaines portions du Form Designer on encore un grand besoin de développement. Dans son ensemble, l'IDE est complet et peut être utilisé pour la plupart des besoins de développement. Cependant, plusieurs aspects du projet ont encore besoin d'aide.
Puis-je utiliser mon code Delphi
Oui mais dans une certaine mesure. Si le code est du "standard Delphi pascal" et utilise les composants standard trouvés dans Delphi... alors la réponse est OUI.
Par contre, si vous utilisez quelques base de données, OCX ou DCU spécifiques... alors la réponse sera probablement non. Ces éléments sont spécifiques a Windows et fonctionneraient uniquemen t avec Windows. Cependant, si vous cherchez a developper des application Windows en utilisant Free Pascal et Lazarus... alors la réponse sera OUI. Cette fonctionalité n'est pas encore ajoutée à la LCL mais cela sera possible dans le future.
Puis-je créer des applications commerciales?
La réponse est OUI (voir ici pour plus d'informations)
Quelques questions sans réponses
Dans l'immédiat, mes maigres recherches n'ont pas encore répondu au questions suivantes:
Sources:
C'est un peu par hazard que je suis revenu faire un tour sur le site officiel... l'ocassion d'écrire un petit billet pour mémoire.
Qu'est ce que Lazarus
Lazarus est une librairie de classes pour FreePascal qui émulent Delphi. Free Pascal est un compilateur sous license GPL fonctionnant sous Linux, Win32, OS/2, 68K et plus encore. Free Pascal a été conçu pour être capable de comprendre et compiler la syntaxe Orienté Object de Delphi.. Lazarus est la piece manquante du puzzle perrmettant de développer des logiciels Delphi pour différentes plateformes. A l'opposé du principe de Java "coder & compiler une fois, exécuté partout", Lazarus et Free Pascal opte pour l'approche "coder une fois, compilable partout". Puisque le même compilateur est disponible sur toutes les plateformes, cela signifie qu'il n'est pas nécessaire de modifier le code pour produire 'exactement' la même application pour différentes plateforme.
Quelle GUI est utilisé? Quel type de Widget?
C'est la partie la plus achevée. Lazarus a été développé pour être totalement et completement indépendant des API. Une fois le code écrit, la compiler link ce dernier aux APIs des widget que vous avez choisi. Si vous voulez utiliser GTK+ ou encore être Gnome compliant... pas de problème. Aussi longtemps que le code d'interfacage existe pour les widgets que vous utiliser... vous pouvez les utiliser (link). S'il n'est pas disponible, vous pouvez l'écrire.
Par exemple. Disons que vous créez un produit pour Windows utilisant les widgets standards de Windows. Et bien maintenant, vous pouvez créer une version Linux.
Premièrement, vous décidez quel est le set de widgets que vous voulez utiliser (par exemple gtk+).
Vous copier votre code sur une machine de développement Linux, vous compilez et linkez ce dernier avec l'interfacage Gtk+ (gtk+ interface unit).
Voila comment vous venez juste de créer une version Linux d'un produit Windows sans coding addtitionnel.
At ce state le Team Lazarus utilise gtk+ comme widget d'origine... mais l'équipe travaille actuellement sur Qt et les API Win32. Des que Lazarus atteindra la version 1.0, les développeurs seront capable de créder/développer les unités d'interface pour attacher la LCL (Lazarus Component Libraries) a d'autres ensembles de widget.
Est-ce un environnement RAD comme Delphi?
Oui... cependant, il n'est pas encore complet. Certaines portions du Form Designer on encore un grand besoin de développement. Dans son ensemble, l'IDE est complet et peut être utilisé pour la plupart des besoins de développement. Cependant, plusieurs aspects du projet ont encore besoin d'aide.
Puis-je utiliser mon code Delphi
Oui mais dans une certaine mesure. Si le code est du "standard Delphi pascal" et utilise les composants standard trouvés dans Delphi... alors la réponse est OUI.
Par contre, si vous utilisez quelques base de données, OCX ou DCU spécifiques... alors la réponse sera probablement non. Ces éléments sont spécifiques a Windows et fonctionneraient uniquemen t avec Windows. Cependant, si vous cherchez a developper des application Windows en utilisant Free Pascal et Lazarus... alors la réponse sera OUI. Cette fonctionalité n'est pas encore ajoutée à la LCL mais cela sera possible dans le future.
Puis-je créer des applications commerciales?
La réponse est OUI (voir ici pour plus d'informations)
Quelques questions sans réponses
Dans l'immédiat, mes maigres recherches n'ont pas encore répondu au questions suivantes:
- Est-il possible de faire des développements attaquant des DB Microsoft Sql Server (en Ado ou OleDB ou SqlClient)?
C'est déjà possible avec le projet mono (c# compiler pour Linux)... quid pour Lazarus? - Est-il possible de faire des développement web (WebModule) utilisant Apache?
- Est-il possible de développer des WebServices?
Sources:
- Site officiel www.lazarus.freepascal.org
- Tutorial d'installation de Lazarus sur Ubuntu (Post de référence).
- Lazarus-fr.net espace communautaire dédié aux utilisateurs de Lazarus (ou ici).
Libellés :
Delphi,
Développement,
Ubuntu
Publication pour Delphi - Blaise Pascal
Voila bien longtemps que je n'avais plus eu vent de publications dans le domaine.
Après la disparition de "Delphi Informant" et "Delphi Magazine" il ne restait plus trop grand chose d'intéressant à lire.
Ce matin, je suis tombé par hasard sur "Blaise Pascal" une publication intéressante autour de Delphi et pascal.
A l'occasion, je pousserai les investigations un peu plus loin.
Après la disparition de "Delphi Informant" et "Delphi Magazine" il ne restait plus trop grand chose d'intéressant à lire.
Ce matin, je suis tombé par hasard sur "Blaise Pascal" une publication intéressante autour de Delphi et pascal.
A l'occasion, je pousserai les investigations un peu plus loin.
mercredi 12 novembre 2008
Prism - Delphi pour .Net sous Windows et Mono
J'apprends qu'Embarcadero Technologies (nouveau propriétaire de Delphi) distribue un produit nommé Prism.
Ce dernier est un environnement de développement Delphi pour la plateforme .Net basé sur le célébrissime Visual Studio.Net.
Basé sur un compilateur d'une nouvelle génération (produit par Oxygène), cette version de Delphi.Net est capable de manipuler les types génériques et fonctions anonymes.
Les assemblies produites sont 100% compatibles avec l'environnement .Net de Microsoft (et Mono).
Par ailleurs, l'environnement Prism (basé sur Visual Studio .Net) inclus toutes les technologies .Net récentes (WPF, LinQ, WCF, SilverLight, WinForms, Asp.Net, ...) mais également quelques autres technologies issues du monde Delphi (RemObjects d'Hydra, dbExpress, DataSnap clients).
La version Architect de Delphi Prism inclus des capacités de design, modélisation et documentation de base de données basés sur ER/Studio.
Quelques caractéristiques clés:
Ce dernier est un environnement de développement Delphi pour la plateforme .Net basé sur le célébrissime Visual Studio.Net.
Basé sur un compilateur d'une nouvelle génération (produit par Oxygène), cette version de Delphi.Net est capable de manipuler les types génériques et fonctions anonymes.
Les assemblies produites sont 100% compatibles avec l'environnement .Net de Microsoft (et Mono).
Par ailleurs, l'environnement Prism (basé sur Visual Studio .Net) inclus toutes les technologies .Net récentes (WPF, LinQ, WCF, SilverLight, WinForms, Asp.Net, ...) mais également quelques autres technologies issues du monde Delphi (RemObjects d'Hydra, dbExpress, DataSnap clients).
La version Architect de Delphi Prism inclus des capacités de design, modélisation et documentation de base de données basés sur ER/Studio.
Quelques caractéristiques clés:
- Solution de développement complete pour .Net
- Puissance du langage de développement Delphi Prism (Generics).
- Framework dbExpress pour construire des applications Base de Données.
- Support de la platform Mono
- Modélisation et design de base de donnée à l'aide du produit ER/Studio.
- Création de clients DataSnap.
- Base de donnée Blackfish SQL incluant les licenses de déploiement.
Libellés :
.net,
Delphi,
Développement,
Mono
mercredi 29 octobre 2008
Débogger des ISAPI avec Delphi 2007
Configurer correctement IIS
En suivant scrupuleusement les recommandations de cet article, nous pouvions débogger nos DLL isapi écritent en Delphi 2007.
Des breakpoints qui ne s'activent pas!
Cependant, de temps à autres, il y avait des modules isapi pour lesquels les breakpoints n'étaient pas activés alors même que les "debug infos" étaient visiblement inclus (petit point bleu dans la marge après la compilation) .
Comme signe caractéristiques de ce disfonctionnement, les breakpoints viraient à la couleur "caca d'oie" tout en arborant un symbole breakpoint univoque (un signe d'interdiction) au moment du chargement du module isapi.
Après de multiples essais pour inclure autant de debug information que possible, c'est une peu part hasard que j'ai activé l'option "Include remote debug Symbols" dans la section LINKER des options du projet.
Après cet activation, mes breakpoints ont soudainement fonctionnés correctement. Génial!
Configuration screenshots
Voici quelques prise de vue d'une configuration qui fonctionne parfaitement pour débogguer des dll ISAPI avec IIS.
Cliquer pour agrandir
En suivant scrupuleusement les recommandations de cet article, nous pouvions débogger nos DLL isapi écritent en Delphi 2007.
Des breakpoints qui ne s'activent pas!
Cependant, de temps à autres, il y avait des modules isapi pour lesquels les breakpoints n'étaient pas activés alors même que les "debug infos" étaient visiblement inclus (petit point bleu dans la marge après la compilation) .
Comme signe caractéristiques de ce disfonctionnement, les breakpoints viraient à la couleur "caca d'oie" tout en arborant un symbole breakpoint univoque (un signe d'interdiction) au moment du chargement du module isapi.
Après de multiples essais pour inclure autant de debug information que possible, c'est une peu part hasard que j'ai activé l'option "Include remote debug Symbols" dans la section LINKER des options du projet.
Après cet activation, mes breakpoints ont soudainement fonctionnés correctement. Génial!
Configuration screenshots
Voici quelques prise de vue d'une configuration qui fonctionne parfaitement pour débogguer des dll ISAPI avec IIS.
Cliquer pour agrandir
Inscription à :
Articles (Atom)





