OpenDialog fait planter mon application

Signaler
Messages postés
7
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
25 mars 2005
-
Messages postés
7
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
25 mars 2005
-
Bonjour à tous, et merci pour vos reponses/suggestions.





Voila mon probleme :





J'ai un programme principal qui utilise des plugins, dans ces plugins j'utilise des dll.





Tout va bien jusqu'au moment ou dans le programme principale ou encore
dans les plugins j'utilise un composant du type OpenDialog/SaveDialog.


A ce moment la : impossible d'utiliser les dlls dans mes plugins.


Erreur du type : violation d'accès a l'adresse ...





Merci Encore de vos reponses car je ne vois vraiment pas comment me sortir de la.



Pour info le programme est tiré du livre Delphi 7 Studio.

13 réponses

Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
7
Hello,



Comment utilises tu le composant OpenDialog? Est ce que tu prends le
compos depuis la barre d'outils et tu le poses sur ta fiche ou est ce
que tu le crées dynamiquement?

Bonne prog,
JMP77.

N'oubliez pas de cliquer sur réponse acceptée.
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
pourrais-tu aussi nous donner le code qui est lié à son utilisation ?


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Messages postés
7
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
25 mars 2005

j'utilise le composant dans la barre d'outils.

Pour le code correspondant je veux bien mais il s'agit simplement d'un appel a une dll

tres simple...

Par contre je veux bien envoyer le code a qui le veux.
Messages postés
7
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
25 mars 2005

Personne peut m'aider ?
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
"Pour le code correspondant je veux bien mais il s'agit simplement d'un appel a une dll"

mets ce code sur le forum !


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Messages postés
7
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
25 mars 2005

ok
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
je veux dire mets-le ici, n'ajoute pas de source !


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Messages postés
7
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
25 mars 2005

Donc je repette il s'agit du code tiré du livre delphi 7 studio chap. 19 ou j'ai ajouter(pour tester)

un appel a une dll dans le plugins.Donc tout fonctionnne correctement, le plantage arrive apres :

opendialog.execute sur le programme principal.

A ce moment la impossible d'utiliser le plugin.(tu enleve l'appel a la
dll (Obj :=GetObjet2;) dans le programme et ca marche nickel...)



voila le source Projet principal :



//***************************************************

unit IPlugins;



interface



uses

Windows,Classes,SysUtils;



Type

IPlugin=interface(IInterface)

procedure DoClick; stdcall;

function Caption:pchar; stdcall;

function ShortCut:TShortCut; stdcall;

function Bitmap:THandle; stdcall;

end;



TCreatePlugin=function:IPlugin; stdcall;



TPlugin=class

private

fHandle :THandle;

fCreate :TCreatePlugin;

fPlugin :IPlugin;

public

Constructor Create(FileName:pchar);

Destructor Destroy; override;

property Instance:IPlugin read fPlugin;

end;



implementation



Constructor TPlugin.Create(FileName:Pchar);

begin

// Chargement de la DLL

fHandle:=LoadLibrary(PChar(FileName));

if fHandle=0 then raise Exception.Create('Impossible de charger la DLL');

// Recherche de la fonction d'init

fCreate:=GetProcAddress(fHandle,'CreatePlugin');

if @fCreate=nil then raise Exception.Create('Ce n''est pas un i-plugin');

// Création du plugin

fPlugin:=fCreate;

end;



Destructor TPlugin.Destroy;

begin

// Libérer l'interface avec un appel automatique à "_Release" confirmé

// par le message "Bye !" dans le Destructor du plugin

fPlugin:=nil;

// Libération de la DLL

if fHandle<>0 then FreeLibrary(fHandle);

inherited;

end;



end.



//********************************************************//



unit Unit2;



interface



uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Menus, ExtCtrls;



type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

PluginsMenu: TMenuItem;

ListBox1: TListBox;

Button1: TButton;

OpenDialog1: TOpenDialog;

procedure FormDestroy(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Déclarations privées }

PlugList:TList;

procedure PluginClick(Sender:TObject);

public

{ Déclarations publiques }

end;



var

Form1: TForm1;



implementation



{$R *.dfm}



uses

IPlugins;



procedure TForm1.FormDestroy(Sender: TObject);

var

i:integer;

begin

// libération de tous les plugins

for i:=0 to PlugList.Count-1 do TPlugin(PlugList[i]).Free;

PlugList.Free;

end;



procedure TForm1.PluginClick(Sender:TObject);

var

tag:integer;

begin

// Appelle la procédure DoClick du plugin associé

if Sender is TMenuItem then begin

Tag:=TMenuItem(Sender).Tag;

if TObject(Tag) is TPlugin then TPlugin(Tag).Instance.DoClick;

end;

end;



procedure TForm1.Button1Click(Sender: TObject);

begin

OpenDialog1.Execute;

end;



procedure TForm1.FormCreate(Sender: TObject);

var

Path :string;

SearchRec:TSearchRec;

Plugin :TPlugin;

Menu :TMenuItem;

begin

// La liste des plugins chargés

PlugList:=TList.Create;

// Le répertoire contenant les plugins

Path:=ExtractFilePath(Application.ExeName);



// Recherche toutes les DLL

if FindFirst(Path+'*.DLL',faAnyFile,SearchRec)=0 then begin

repeat

ListBox1.Items.Add(SearchRec.Name);

try

// On essaye d'en faire un Plugin

Plugin:=TPlugIn.Create(Pchar(SearchRec.Name));

PlugList.Add(Plugin);

Menu:=NewItem(Plugin.Instance.Caption,Plugin.Instance.ShortCut,False, True, PluginClick, 0, '');

Menu.Bitmap.Handle:=Plugin.Instance.Bitmap;

// faire le lien entre le TMenuItem et le TPlugIn pour l'évènement PlugInClick ci-dessous

Menu.Tag:=integer(Plugin);

PlugInsMenu.Add(Menu);

except

on e:Exception do ListBox1.Items.Add(e.Message);

end;

until FindNext(SearchRec)<>0;

end;

FindClose(SearchRec);





end;



end.



Ensuite voila le plugins :





library IPlugin1;



uses

Windows,

Classes,

Dialogs,

Menus,

IPlugins,

UnitImport2 in 'UnitImport2.pas';



{$R bitmap1.res}



Type

TIPlugin=class(TInterfacedObject,IPlugin)

private

fCaption :string;

fShortCut:TShortCut;

fBitmap :THandle;

public

Constructor Create(ACaption:Pchar; AShortCut:TShortCut; ABitmap:THandle);

Destructor Destroy; override;

// interface IPlugin

procedure DoClick; stdcall;

function Caption:pchar; stdcall;

function ShortCut:TShortCut; stdcall;

function Bitmap:THandle; stdcall;

end;



Constructor TIPlugin.Create(ACaption:Pchar; AShortCut:TShortCut; ABitmap:THandle);

begin

inherited Create;

fCaption:=ACaption;

fShortCut:=AShortCut;

fBitmap:=ABitmap;

end;



Destructor TIPlugin.Destroy;

begin



inherited;

end;



procedure TIPlugin.DoClick;

var Obj : TObjet2;

begin

Obj :=GetObjet2; // ca plante ici une fois que opendialog est executer

ShowMessage('Clicked on '+fCaption);

end;



function TIPlugin.Caption:pchar;

begin

Result:=PChar(fCaption);

end;




function TIPlugin.ShortCut:TShortCut;

begin

Result:=fShortCut;

end;



function TIPlugin.Bitmap:THandle;

begin

Result:=fBitmap;

end;



function CreatePlugin:IPlugin; stdcall;

begin

Result:=TIPlugin.Create('IPlugin 1',TextToShortCut('Ctrl+1'),LoadBitmap(hInstance,'PLUGIN'));

end;



exports

CreatePlugin;



begin

end.



interface de la dll..

//***************************************

unit UnitImport2;



interface



type



TObjet2 = class

private

public

procedure Test(Value: Double); virtual; abstract;

end;



function GetObjet2 : TObjet2; external '..\Dll2\DLL2.dll';



implementation



{ TObjetExemple }



end.



// est maintenant la dll



unit Unitclass;



interface



uses dialogs;



type



TObjet2 = class



private



public

procedure Test(Value: Double); virtual; export;

end;



function GetObjet2 : TObjet2;



implementation



{ TObjetExemple }



function GetObjet2 : TObjet2; export;

begin

result := TObjet2.Create;

end;



procedure TObjet2.Test(Value: Double); export;

var i : double;

begin

i:= Value;

end;



end.



Voila il n'y a rien qui casse des briques... c'est juste un programme de test.

Merci encore de vos reponses.
Messages postés
194
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
10 octobre 2006
2
A moins que je sois aveugle , TObjet2 est une class et donc nécéssite une Creation et une Libération. Or je n'en ai pas vu en parcourant le code... Et accéder à une class non crée fait planter

Tout problème a sa solution... Mais en général, c'est jamais la bonne...
Messages postés
194
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
10 octobre 2006
2
oops j'avais mal lu, c'est tout en bas, j'ai rien dit lol

Tout problème a sa solution... Mais en général, c'est jamais la bonne...
Messages postés
7
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
25 mars 2005

ta vu un probleme dans le code ?
Messages postés
194
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
10 octobre 2006
2
non mais ca ca me chiffonne :
interface de la dll..
//***************************************
unit UnitImport2;

une dll commence pas par library plutot que unit?

Tout problème a sa solution... Mais en général, c'est jamais la bonne...
Messages postés
7
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
25 mars 2005

non il s'agit de l'interface.