Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-08-2008, 10:33   #1
Franziscko
 
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à , vediamo se potete aiutarmi.

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.
Dimenticavo: se lancio l'eseguibile e non premo il pulsante, cioè non richiamo la funzione, l'errore c'è lo stesso, come se fosse quindi nel caricare o scaricare la dll (avrò sparato una scemenza... ).

Grazie a chi potrà aiutarmi.
Ciao.
  Rispondi citando il messaggio o parte di esso
Old 07-08-2008, 19:50   #2
Franziscko
 
Messaggi: n/a
Ragazzi.....ma conoscete solo C e Java? Nessuno può aiutarmi??? pliiiisssss....
miiiiiiiiii..........che tristezzzzzaaaa!!!!
  Rispondi citando il messaggio o parte di esso
Old 07-08-2008, 19:55   #3
Kevvort
Member
 
L'Avatar di Kevvort
 
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
Kevvort è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 00:16   #4
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
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;
Non dovrebbe essere una cosa così?
Codice:
label1.Caption := GetCurrentTime();
label2.Caption := GetCurrentDate();
Comunque posso aver detto anche una bella boiata, i miei ricordi del Delphi sono vaghi e lontani.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 07:16   #5
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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;
Io avrei scritto così:
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 08:35   #6
Franziscko
 
Messaggi: n/a
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
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;
Non dovrebbe essere una cosa così?
Codice:
label1.Caption := GetCurrentTime();
label2.Caption := GetCurrentDate();
Comunque posso aver detto anche una bella boiata, i miei ricordi del Delphi sono vaghi e lontani.
No, funziona lo stesso, e cmq non è quello il punto perchè ho l'errore anche se non richiamo la funzione, mi basta lanciare l' exe e poi chiuderlo senza aver fatto nulla.
  Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 08:37   #7
Franziscko
 
Messaggi: n/a
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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;
Io avrei scritto così:
Codice:
function GetCurrentTime: string; stdcall;
begin
 result := TimeToStr(Now);
end;
Anche questo funziona lo stesso così. Ho provato anche altre mie funzioni ma il problema è alla base, nel caricare e scaricare la dll, a questo punto mi rendo conto che è solo quello.
  Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 08:44   #8
variabilepippo
Senior Member
 
L'Avatar di variabilepippo
 
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.
variabilepippo è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 09:28   #9
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 09:35   #10
variabilepippo
Senior Member
 
L'Avatar di variabilepippo
 
Iscritto dal: Mar 2007
Messaggi: 1792
Quote:
Però c'era la uses ShareMem: in teoria non dovrebbe avere problemi.
Quando posso evito l'uso della unit ShareMem, oltre ad introdurre una dipendenza, impatta anche sulle prestazioni e causa crash a volte "inspiegabili".
variabilepippo è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 09:48   #11
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 09:54   #12
variabilepippo
Senior Member
 
L'Avatar di variabilepippo
 
Iscritto dal: Mar 2007
Messaggi: 1792
Quote:
Grazie per il link!
Di nulla!

Visto che siamo in argomento suggerisco anche FastMM e FastCode.
variabilepippo è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 10:32   #13
Franziscko
 
Messaggi: n/a
Quote:
Originariamente inviato da variabilepippo Guarda i messaggi
Quando posso evito l'uso della unit ShareMem, oltre ad introdurre una dipendenza, impatta anche sulle prestazioni e causa crash a volte "inspiegabili".
Intanto grazie a tutti....

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.
  Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 10:34   #14
variabilepippo
Senior Member
 
L'Avatar di variabilepippo
 
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?
variabilepippo è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 10:39   #15
Franziscko
 
Messaggi: n/a
Ahem......
ho scaricato la fastsharemem che è un .pas , come devo usarlo?
  Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 10:42   #16
Franziscko
 
Messaggi: n/a
Quote:
Originariamente inviato da variabilepippo Guarda i messaggi
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?
NOn sono più sicuro di niente...
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?
  Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 11:14   #17
variabilepippo
Senior Member
 
L'Avatar di variabilepippo
 
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.
e l'ho testato con

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.
Accantona per un attimo il codice originale, elimina sharemem dal programma principale e prova con la soluzione proposta.
variabilepippo è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 11:24   #18
variabilepippo
Senior Member
 
L'Avatar di variabilepippo
 
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.
variabilepippo è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 11:45   #19
Franziscko
 
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.
  Rispondi citando il messaggio o parte di esso
Old 08-08-2008, 11:55   #20
variabilepippo
Senior Member
 
L'Avatar di variabilepippo
 
Iscritto dal: Mar 2007
Messaggi: 1792
Quote:
ho provato il tuo primo esempio, togliendo ShareMem
Nel primo esempio non devi soltanto eliminare sharemem dalla DLL e dal progetto, devi anche effettuare il cast a pchar.

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!
variabilepippo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Huawei punta sul mercato auto europeo: i...
La telepatia diventa realtà: una start-u...
Il Samsung Galaxy S26 Pro sarà un...
Amazon: in arrivo degli occhiali AR per ...
Un Tesla Cybertruck per le vie di Milano...
Qualcomm Quick Charge 5+: il nuovo siste...
Google Pixel Buds A-Series quasi a met&a...
Google contro le immagini fake fatte con...
Narwal Flow sbarca su Amazon: due robot ...
Bioshock: il film di Netflix si far&agra...
Samsung 'trolla' Apple su X con la campa...
Apple Watch Series 11, Ultra 3 e SE 3 gi...
Landspace: il fallimento del lancio di u...
Windows 11 25H2: Microsoft rilascia le I...
Milano, dal 15 settembre via alle multe ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:22.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v