|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Messaggi: n/a
|
[Delphi] Problema con .dll che esporta una stringa
Ciao a tutti, è la prima volta che posto in questa sezione, ho uno stupido problema che non riesco a risolvere, ma inizio dagli...inizi!
![]() La mia esperienza si basa sul Basic del mitico ZX Spectrum, poi col 486 ho usato il Qbasic, infine sono passato al Turbo Pascal, non appena ho visto gli 'oggetti' mi sono fermato, intanto è arrivato windows e con esso Delphi, ora uso Delphi 7, sono totalmente autodidatta, cerco di capire come funziona qualcosa dai listati che trovo e dagli esempi, non capisco un acca di oggetti, almeno per quanto riguarda crearli, ma dagli esempi dell'help riesco un po' a far funzionare quel che mi serve, non senza sbattere la testa per soluzioni a volte semplicissime. Programmo per diletto, niente altro. Credo di essere il peggior programmatore qui dentro!! ![]() Bene, ora che conoscete le mie qualità ![]() Vorrei cominciare ad usare le .dll per non scrivere sempre le stesse cose, ed ho trovato alcuni esempi, ma non me ne funziona nemmeno uno. Mi spiego: la .dll viene creata, la richiamo e funziona, ricevo la stringa interessata, solo che al momento poi di chiudere l'eseguibile, Delphi mi dà questo errore: INVALID POINTER OPERATION, mentre se uso l'eseguibile da solo senza delphi, quando lo chiudo ricevo questo errore: RUNTIME ERROR 217 AT 00413DB4. Questo è il listato della dll che, ripeto, è un esempio trovato in rete. Codice:
library DLLFile; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } uses ShareMem, SysUtils, Classes; {$R *.res} function GetCurrentTime: string; stdcall; begin result := PAnsiChar(TimeToStr(Now)); end; function GetCurrentDate: string; stdcall; begin result := DateToStr(Now); end; exports GetCurrentTime, GetCurrentDate; end. Questo è invece il listato che richiama la dll, fatot da me, tanto per provarlo: Codice:
unit Unit1; interface uses ShareMem, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation function GetCurrentTime: string; stdcall External 'DLLFile.dll'; function GetCurrentDate: string; stdcall External 'DLLFile.dll'; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin label1.Caption := GetCurrentTime; label2.Caption := GetCurrentDate; end; end. ![]() Grazie a chi potrà aiutarmi. Ciao. ![]() |
![]() |
![]() |
#2 |
Messaggi: n/a
|
Ragazzi.....ma conoscete solo C e Java? Nessuno può aiutarmi??? pliiiisssss....
miiiiiiiiii..........che tristezzzzzaaaa!!!! ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Jul 2008
Città: Reggio Emilia
Messaggi: 290
|
Mi dispiace non saperti aiutare, studio anche io turbo pascal a scuola ma la programmazione ad oggetti la comincerò solo a settembre
![]() Fidati che chi conosce TP ce ne sono ma saranno in vacanza |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Mamma mia quanto tempo che non uso il Pascal o suoi derivati, ci sono cose che non ricordo: ad esempio, la dichiarazione e l'invocazione di funzioni che non necessitano di parametri può essere fatta anche senza parentesi tonde vuote?
Mi spiego meglio, il mio dubbio è questo: Codice:
label1.Caption := GetCurrentTime; label2.Caption := GetCurrentDate; Codice:
label1.Caption := GetCurrentTime(); label2.Caption := GetCurrentDate(); ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Sì, senza argomenti le parentesi sono opzionali.
Al momento l'unica cosa che mi sembra strana è questa: Codice:
function GetCurrentTime: string; stdcall; begin result := PAnsiChar(TimeToStr(Now)); end; Codice:
function GetCurrentTime: string; stdcall; begin result := TimeToStr(Now); end;
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#6 | |
Messaggi: n/a
|
Quote:
|
|
![]() |
![]() |
#7 | |
Messaggi: n/a
|
Quote:
|
|
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Prova così:
Codice:
library DLLFile; uses SysUtils, Classes; function GetCurrentTime: string; stdcall; begin result := PChar(TimeToStr(Now)); end; function GetCurrentDate: string; stdcall; begin result := PChar(DateToStr(Now)); end; exports GetCurrentTime, GetCurrentDate; end. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Però c'era la uses ShareMem: in teoria non dovrebbe avere problemi.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Quote:
|
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Azz. Bellissima!!!
![]() Potrebbe provare quest'alternativa a ShareMem e vedere se adesso gli funziona. Grazie per il link! ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#13 | |
Messaggi: n/a
|
Quote:
![]() Quindi la Borland dice di usare ShareMem ma dici che potrebbe dare problemi? Certo che se non è assurda questa....... ora ci provo.... Ho fatto anche l'esempio che mi hai suggerito e anche tanti altri, quella lì era proprio una dll di esempio, io ne ho create altre di mie, ma l'errore è sempre lo stesso, torno a ripetere che funziona tutto, ma anche se non richiamo la funzione, mi basta lanciare l'exe e richiuderlo che mi dà l'errore. Potrebbe essere qualche dll o altro che non va tra quelle installate in windows? non l'ho provato in altri pc. |
|
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Io ho scritto codice di esempio sia con il cast a pchar sia con l'ausilio della sharemem e tutto funziona alla perfezione, senza crash. Sicuro che il problema non sia altrove?
|
![]() |
![]() |
![]() |
#15 |
Messaggi: n/a
|
Ahem......
![]() ho scaricato la fastsharemem che è un .pas , come devo usarlo? ![]() |
![]() |
![]() |
#16 | |
Messaggi: n/a
|
Quote:
solo che ho postato esattamente i due listati, compilo, ed ho l'errore, non faccio niente altro...potrebbe essere qualche dll di sistema? Ho un Core2 Duo E6600 @ default con 2 giga di ram.....potrebbe dare fastidio? |
|
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Io ho compilato questo codice:
Codice:
library Libreria; uses SysUtils, Classes; function GetCurrentTime: string; stdcall; begin result := PChar(TimeToStr(Now)); end; function GetCurrentDate: string; stdcall; begin result := PChar(DateToStr(Now)); end; exports GetCurrentTime, GetCurrentDate; end. Codice:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function GetCurrentTime: string; stdcall External 'libreria.dll'; function GetCurrentDate: string; stdcall External 'libreria.dll'; procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage(GetCurrentTime+' del '+GetCurrentDate); end; end. |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Soluzione alternativa:
Codice:
library DLLFile2; uses FastShareMem, SysUtils, Classes; function GetCurrentTime: string; stdcall; begin result := TimeToStr(Now); end; function GetCurrentDate: string; stdcall; begin result := DateToStr(Now); end; exports GetCurrentTime, GetCurrentDate; end. Codice:
unit Unit1; interface uses FastShareMem, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function GetCurrentTime: string; stdcall External 'libreria2.dll'; function GetCurrentDate: string; stdcall External 'libreria2.dll'; procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage(GetCurrentTime+' del '+GetCurrentDate); end; end. |
![]() |
![]() |
![]() |
#19 |
Messaggi: n/a
|
Aggiornamento
ho provato il tuo primo esempio, togliendo ShareMem, ho l'errore anche quando premo il pulsante, oltre che quando chiudo l'exe. Ora provo FastSharemem. |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Quote:
Nel secondo ho sostituito sharemem con fastsharemem sia nella DLL sia nella unit principale. In entrambi i casi ho l'output corretto senza crash. PS. Assicurati di ricompilare le DLL e gli eseguibili dopo ogni modifica! |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:22.