mikec459
asked on
DLLs
I just got a great answer about a Dll question.
So Heres another one .
if I have 2 dll's both have the same function names
when I load the dll's as so :
Hinst := LoadLibrary('c:\files\mike s\projects \dll\proje ct1.dll');
if Hinst > 32 then;
begin
FPointer := GetProcAddress(Hinst, 'EntryPoint');
if FPointer <> Nil then
begin
MyProc := proc(FPointer);
try
MyProc(MainMenu1);;
except
FreeLibrary(HInst);
ShowMessage('Error in Calling EntryPoint in DLL');
end;
end;
end;
Hinst := LoadLibrary('c:\files\mike s\projects \dll\DLL2. dll');
if Hinst > 32 then;
begin
FPointer := GetProcAddress(Hinst, 'EntryPoint');
if FPointer<> Nil then
begin
MyProc := proc(FPointer);
try
MyProc(MainMenu1);
except
FreeLibrary(HInst1);
ShowMessage('Error in Calling EntryPoint in DLL');
end;
end;
end;
what the dlls do are they loads two menu Items. This works the two deffernt menu do load but when I click on the first menu item(first dll that loaded) it runs the right function. when I click on the 2nd menu item(the 2nd dll that loaded) it runs the first menu item not the 2nd?
Both dll have the same function names but the function do differnt things. can anyone explain this to be because I thought if the dlls load in there own memory space the function address would be differnt even if they were name the same. well I quest I'm wrong?
--------------- Code for Dll -------------------------- ---------- --
//both dlls are the same except for the showmessage()
//which is in the DynaClick() procedure.
uses
Menus, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TEvent = procedure(Sender: TObject) of object;
TSomeClass = Class
procedure DynaClick(Sender: TObject);
end;
var
NewMenu : TMenuItem;
SomeClass : TSomeClass;
Event : TEvent;
procedure TSomeClass.DynaClick(Sende r: TObject);
begin
showMessage('Its Dll 2');
end;
procedure EntryPoint(AMenu: TMenu); export; stdcall;
var
NoItem : TMenuItem;
begin
//create a event handler...
SomeClass := TSomeClass.Create;
//assign Event to DynaClick to be pass to the menu Onclick event...
Event := SomeClass.DynaClick;
NoItem := AMenu.Items[AMenu.Items.Co unt - 1];
NewMenu := TMenuItem.Create(NoItem);
NewMenu.Caption := 'DLL2 Menu';
NewMenu.OnClick := Event;
NoItem.Insert(NoItem.Count , NewMenu);
SomeClass.Free;
end;
exports
EntryPoint;
So Heres another one .
if I have 2 dll's both have the same function names
when I load the dll's as so :
Hinst := LoadLibrary('c:\files\mike
if Hinst > 32 then;
begin
FPointer := GetProcAddress(Hinst, 'EntryPoint');
if FPointer <> Nil then
begin
MyProc := proc(FPointer);
try
MyProc(MainMenu1);;
except
FreeLibrary(HInst);
ShowMessage('Error in Calling EntryPoint in DLL');
end;
end;
end;
Hinst := LoadLibrary('c:\files\mike
if Hinst > 32 then;
begin
FPointer := GetProcAddress(Hinst, 'EntryPoint');
if FPointer<> Nil then
begin
MyProc := proc(FPointer);
try
MyProc(MainMenu1);
except
FreeLibrary(HInst1);
ShowMessage('Error in Calling EntryPoint in DLL');
end;
end;
end;
what the dlls do are they loads two menu Items. This works the two deffernt menu do load but when I click on the first menu item(first dll that loaded) it runs the right function. when I click on the 2nd menu item(the 2nd dll that loaded) it runs the first menu item not the 2nd?
Both dll have the same function names but the function do differnt things. can anyone explain this to be because I thought if the dlls load in there own memory space the function address would be differnt even if they were name the same. well I quest I'm wrong?
--------------- Code for Dll --------------------------
//both dlls are the same except for the showmessage()
//which is in the DynaClick() procedure.
uses
Menus, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TEvent = procedure(Sender: TObject) of object;
TSomeClass = Class
procedure DynaClick(Sender: TObject);
end;
var
NewMenu : TMenuItem;
SomeClass : TSomeClass;
Event : TEvent;
procedure TSomeClass.DynaClick(Sende
begin
showMessage('Its Dll 2');
end;
procedure EntryPoint(AMenu: TMenu); export; stdcall;
var
NoItem : TMenuItem;
begin
//create a event handler...
SomeClass := TSomeClass.Create;
//assign Event to DynaClick to be pass to the menu Onclick event...
Event := SomeClass.DynaClick;
NoItem := AMenu.Items[AMenu.Items.Co
NewMenu := TMenuItem.Create(NoItem);
NewMenu.Caption := 'DLL2 Menu';
NewMenu.OnClick := Event;
NoItem.Insert(NoItem.Count
SomeClass.Free;
end;
exports
EntryPoint;
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.