Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Al .NEXT 2026 di Chicago, Nutanix ha mostrato quanto sia cambiata: una piattaforma software che gestisce VM, container e carichi di lavoro IA ovunque, dall’on-premise al cloud pubblico. Con un’esecuzione rapidissima sulle partnership e sulla migrazione da VMware
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


DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
La NASA ha confermato il supporto per il...
Sierra Space ha completato il test acust...
Ryzen 7 5800X3D pronto a tornare sul mer...
NASA: l'amministrazione Trump prosegue s...
L'Iran avrebbe acquistato un satellite p...
VivaTech compie dieci anni e raddoppia p...
Le vendite di CPU si sono ridotte di 25 ...
Starship: SpaceX ha completato lo static...
Huawei FusionSolar Roadshow 2026: l'inno...
Nuovo trailer per Street Fighter: un fil...
Sovranità sui dati: arriva la pri...
Schede video NVIDIA e AMD di nuovo su Ma...
Robot aspirapolvere, TV OLED, iPhone 17 ...
EUREKA J15 Pro Ultra super interessante ...
Intel porta l'AI nei notebook entry-leve...
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: 06:32.


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