OpenDialog fait planter mon application

mkdual Messages postés 7 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 25 mars 2005 - 24 mars 2005 à 10:50
mkdual Messages postés 7 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 25 mars 2005 - 25 mars 2005 à 09:39
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

jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
24 mars 2005 à 11:12
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.
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
24 mars 2005 à 11:14
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 !
0
mkdual Messages postés 7 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 25 mars 2005
24 mars 2005 à 11:31
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.
0
mkdual Messages postés 7 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 25 mars 2005
24 mars 2005 à 13:28
Personne peut m'aider ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
24 mars 2005 à 13:30
"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 !
0
mkdual Messages postés 7 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 25 mars 2005
24 mars 2005 à 13:32
ok
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
24 mars 2005 à 13:36
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 !
0
mkdual Messages postés 7 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 25 mars 2005
24 mars 2005 à 13:49
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.
0
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
24 mars 2005 à 14:07
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...
0
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
24 mars 2005 à 14:10
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...
0
mkdual Messages postés 7 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 25 mars 2005
24 mars 2005 à 15:00
ta vu un probleme dans le code ?
0
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
24 mars 2005 à 18:38
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...
0
mkdual Messages postés 7 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 25 mars 2005
25 mars 2005 à 09:39
non il s'agit de l'interface.
0
Rejoignez-nous