|
| DLL problemer Fra : Claus Bagger |
Dato : 10-06-02 12:08 |
|
Jeg forsøger at lave en DLL I Delphi 5, som skal bruges I C++. I
hovedprogrammet DllFirst er der en procedure TEST som kalder forskellige
metoder, hvor hovedberegningerne foretages (CalculateImage1Click). Jeg har
en Dll kaldet FRAME, hvor TEST eksporteres. Når jeg kalder Dll'en i CALL, så
sker der ingenting i procedure TEST, hvis den indeholder metoden
MainForm.Analyseimage1.Click. Hvis den ikke indeholder denne metode, så
fungere DLL fint og der skrives til filen. Hvorfor kan jeg ikke få
beregningerne til at fungerer ? Jeg håber, at nogen kan hjælpe, da jeg har
kænpet med dette problem i flere uger nu.
På forhånd tak.
Venlig hilsen
Claus Bagger
Danmarks Tekniske Universitet
----------------------------------------------------------------------------
----------------------------
THIS IS THE MAIN PROGRAM WHERE CALCULATIONS TAKE PLACE
unit DllFirst;
interface
uses
ShareMem, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
Menus, StdCtrls, ExtCtrls, ComCtrls, TeEngine, Series, TeeProcs,
Chart;
Function Getstring : string ; export ;
Procedure test; export ;
type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
procedure Analyseimage1Click(Sender: TObject); export ;
procedure CalculateImage1Click(Sender: TObject) ;
procedure TMainForm.Analyseimage1Click(Sender: TObject);
begin
CalculateImage1Click(Sender) ; // Not shown in this example
end;
Procedure test ;
var
TestFile : TextFile ;
begin
MainForm.Analyseimage1.Click ;
// Write to file
AssignFile(TestFile, 'TestFile');
Rewrite(TestFile) ;
writeln(TestFile,'Data for test series : ') ;
writeln(TestFile,'DLL Test OK') ;
CloseFile(TestFile);
end ;
THIS IS THE DLL
----------------------------------------------------------------------------
---------------------------
library Frame;
uses
ShareMem,
SysUtils,
Classes,
DllFirst;
{$R *.RES}
Exports
Test ;
begin
end.
THIS IS THE CALLING PROGRAM
----------------------------------------------------------------------------
-----------
program Call;
{$APPTYPE CONSOLE}
uses
Sharemem,
SysUtils,
Dialogs ,
Windows ;
{$R *.RES}
Procedure test ; external 'Frame.dll' ;
Type
THandle = integer ;
Var
Handle : THandle ;
begin
Handle := LoadLibrary('Frame.dll');
IF handle <> 0 THEN
begin
test ;
end ;
FreeLibrary(handle) ;
end.
| |
René Jensen (10-06-2002)
| Kommentar Fra : René Jensen |
Dato : 10-06-02 16:50 |
|
Claus Bagger wrote:
> Jeg forsøger at lave en DLL I Delphi 5, som skal bruges I C++.
Sidder lige og tænker ... hvorfor bruger du Delphi til at compilere en
..DLL, fremfor at bruge C++ Builder i stedet for, eller Microsoft Visual
C++? Ikke fordi at C++ Builder ikke kan benytte .DLL'er compilet i
Delphi (og vice versa), men hvis resten af applikationen skal skrives i
C/C++, hvorfor så benytte Delphi?
--
Med venlig hilsen,
René Jensen
Once a upon a time a wise man said to me:
"I consider Windows like I consider bad weather ... I accept it and hope
for something better"
| |
Claus Bagger (11-06-2002)
| Kommentar Fra : Claus Bagger |
Dato : 11-06-02 08:18 |
|
Vi har flere års erfaring med udvikling i Pascal, og vi har ingen erfaring i
c eller c++. Desuden er det en udenlandsk samarbejdspartner, som skal
benytte DLL'en, og de benytter c++.
Venlig hilsen
Claus Bagger
"René Jensen" <rene.jensen@adslhome.dk> skrev i en meddelelse
news:3D04CABC.33DF47E1@adslhome.dk...
> Claus Bagger wrote:
> > Jeg forsøger at lave en DLL I Delphi 5, som skal bruges I C++.
>
> Sidder lige og tænker ... hvorfor bruger du Delphi til at compilere en
> .DLL, fremfor at bruge C++ Builder i stedet for, eller Microsoft Visual
> C++? Ikke fordi at C++ Builder ikke kan benytte .DLL'er compilet i
> Delphi (og vice versa), men hvis resten af applikationen skal skrives i
> C/C++, hvorfor så benytte Delphi?
>
> --
> Med venlig hilsen,
> René Jensen
>
> Once a upon a time a wise man said to me:
> "I consider Windows like I consider bad weather ... I accept it and hope
> for something better"
| |
René Jensen (11-06-2002)
| Kommentar Fra : René Jensen |
Dato : 11-06-02 18:38 |
|
Claus Bagger wrote:
> Vi har flere års erfaring med udvikling i Pascal, og vi har ingen erfaring i
> c eller c++. Desuden er det en udenlandsk samarbejdspartner, som skal
> benytte DLL'en, og de benytter c++.
Ok, så bare glem min kommentar.
--
Med venlig hilsen,
René Jensen
Once a upon a time a wise man said to me:
"I consider Windows like I consider bad weather ... I accept it and hope
for something better"
| |
Uffe Kousgaard (11-06-2002)
| Kommentar Fra : Uffe Kousgaard |
Dato : 11-06-02 11:18 |
|
Der ser ud til at være flere problemer:
1) Du bruger Sharemem. Dette kan man næppe med C++. Du skal bruge pchar
ved eksporterede funktioner i stedet for string. Du bruger ikke
funktionen GetString, så det er måske ikke der problemet ligger?
2) Du kalder en metode på et objekt, som ikke er instantieret. Hvorfor
definerer du ikke denne metode som en almindelig metode i stedet for en
metode i en klasse? Så vidt jeg kan se bruger du ikke klassen til noget.
3) Generelt skal funktioner og procedurer eksporteres med stdcall for at
være mest universelt anvendelige. Hele WIN32API anvender stdcall.
Håber dette hjælper.
Hilsen
Uffe
"Claus Bagger" <cb@ipl.dtu.dk> wrote in message
news:ae21db$9vo$1@news.net.uni-c.dk...
> Jeg forsøger at lave en DLL I Delphi 5, som skal bruges I C++. I
> hovedprogrammet DllFirst er der en procedure TEST som kalder
forskellige
> metoder, hvor hovedberegningerne foretages (CalculateImage1Click). Jeg
har
> en Dll kaldet FRAME, hvor TEST eksporteres. Når jeg kalder Dll'en i
CALL, så
> sker der ingenting i procedure TEST, hvis den indeholder metoden
> MainForm.Analyseimage1.Click. Hvis den ikke indeholder denne metode,
så
> fungere DLL fint og der skrives til filen. Hvorfor kan jeg ikke få
> beregningerne til at fungerer ? Jeg håber, at nogen kan hjælpe, da
jeg har
> kænpet med dette problem i flere uger nu.
>
> På forhånd tak.
>
>
>
> Venlig hilsen
>
> Claus Bagger
>
> Danmarks Tekniske Universitet
>
>
>
> ----------------------------------------------------------------------
------
> ----------------------------
>
> THIS IS THE MAIN PROGRAM WHERE CALCULATIONS TAKE PLACE
>
>
>
> unit DllFirst;
>
>
>
> interface
>
>
>
> uses
>
> ShareMem, Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms,
> Dialogs,
>
> Menus, StdCtrls, ExtCtrls, ComCtrls, TeEngine, Series, TeeProcs,
>
> Chart;
>
>
>
> Function Getstring : string ; export ;
>
> Procedure test; export ;
>
>
>
> type
>
> TMainForm = class(TForm)
>
> MainMenu1: TMainMenu;
>
> procedure Analyseimage1Click(Sender: TObject); export ;
>
> procedure CalculateImage1Click(Sender: TObject) ;
>
>
>
> procedure TMainForm.Analyseimage1Click(Sender: TObject);
>
> begin
>
> CalculateImage1Click(Sender) ; // Not shown in this example
>
> end;
>
>
>
> Procedure test ;
>
> var
>
> TestFile : TextFile ;
>
>
>
> begin
>
> MainForm.Analyseimage1.Click ;
>
> // Write to file
>
> AssignFile(TestFile, 'TestFile');
>
> Rewrite(TestFile) ;
>
> writeln(TestFile,'Data for test series : ') ;
>
> writeln(TestFile,'DLL Test OK') ;
>
> CloseFile(TestFile);
>
> end ;
>
>
>
> THIS IS THE DLL
>
> ----------------------------------------------------------------------
------
> ---------------------------
>
> library Frame;
>
>
>
> uses
>
> ShareMem,
>
> SysUtils,
>
> Classes,
>
> DllFirst;
>
>
>
> {$R *.RES}
>
>
>
> Exports
>
> Test ;
>
>
>
> begin
>
> end.
>
>
>
>
>
> THIS IS THE CALLING PROGRAM
>
> ----------------------------------------------------------------------
------
> -----------
>
> program Call;
>
> {$APPTYPE CONSOLE}
>
> uses
>
> Sharemem,
>
> SysUtils,
>
> Dialogs ,
>
> Windows ;
>
>
>
> {$R *.RES}
>
>
>
> Procedure test ; external 'Frame.dll' ;
>
>
>
> Type
>
> THandle = integer ;
>
>
>
> Var
>
> Handle : THandle ;
>
>
>
> begin
>
> Handle := LoadLibrary('Frame.dll');
>
> IF handle <> 0 THEN
>
> begin
>
> test ;
>
> end ;
>
> FreeLibrary(handle) ;
>
> end.
>
>
>
>
>
>
>
>
>
| |
|
|