Newsgroup: it.comp.lang.delphi
Titolo: Variabili record come parametri ad una DLL

Ciao a tutti.
Ho creato una unit con alcune variabili record tipo questa:
type tm1 = record
  c: string;
  i: integer;
  b: boolean;
end;
Questa unit sta nella uses di una dll e di un exe di prova
che mi sono creato a volo per il debug.
nella dll ho un variabile oggetto (titolo) definita nella 
implementation.
Poi ho funzioni tipo le seguenti: 
function Crea: integer;
begin
  Titolo := TMiaClasse.Create;
end;
 
function FaiQualcosa(const Value: tm1): integer;
begin
  Result := 0;
  With Value do
  begin
    Titolo.c := c;
    Titolo.i := i;
    Titolo.b := b;
  end;
end;
function Distruggi: integer
begin
  Titolo.Free
end;
Risultato: si inkazza e mi genera una AV quando vado ad
assegnare ad un membro di tipo stringa di Titolo un valore
stringa preso dal param. Value.
Credevo dipendesse dalla istanza di TMiaClasse, ma se modifico
la funzione faiqualcosa in questo modo:
function FaiQualcosa(const Value: tm1): integer;
begin
  Result := 0;
  begin
    Titolo.c := qualcosa;
    Titolo.i := qualcosaltro;
    Titolo.b := Ancorauno;
  end;
end;
e non si inkazza +.
uso delphi5 sia per la dll che per l'applicazione di test.
ho incluso la sharemem come riportato
le dichiarazioni le ho definite come stdcall.
Se tolgo stdcall e non indico niente, 
si inkazza anche con la faiQualcosa modificata.
Devo usare stringhe a lunghezza fissa o delle shortstring?
O addirittura un pchar?
O cosa?
Grazie x ogni suggerimento.
AS
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

O addirittura un pchar?
Quando si usano delle long-string come parametri delle
funzioni (anche se dentro dei record) bisogna includere la
unit ShareMem nella DLL, perche' faccia da interfaccia alle
routine del memory manager.  Il tuo problema e' dovuto al
fatto che le stringhe nel tuo codice non subiscono il
reference-counting e il copy-on-write, come dovrebbe essere.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

le dichiarazioni le ho definite come stdcall.
Altri suggerimenti?
Intanto faccio altri test.
TIA


 Altri suggerimenti?
Sara' perche' scrivi "const Value" e poi invece gli
assegni dei valori ? >:)


 assegni dei valori ? >:)
No.
I valori const passati come parametri vengono passati
ai membri di una istanza di una mia classe.
Kakkio!
1 giorno e mezzo senza uscirne.
Ho fatto altri test ma non so proprio che accidenti succede.
Ma non mi arrendo: la dll non vincera'.
Bye
AS


 Ma non mi arrendo: la dll non vincera'.
Io ho provato sulla mia macchina e non succede nulla.
Ma non so come e' implementata la tua TMiaClasse.


 Ma non mi arrendo: la dll non vincera'.
Stai facendo il dbg della dll o dell'exe?
Oltre a suggerirti di riempire di OutputDebugString il codice della
funzione della DLL cui passi il record non saprei cosa consigliarti, se
non
a) prendere in *seria* considerazione l'uso di un pchar al posto della
stringa nella tua struttura (anche per semplice compatibilita')
b) provare a passare, invece di (const Value: tm1), un (const pVal:
Ptm1) (non che debba fare qualche differenza)
c) passare separatamente i 3 campi che costituiscono la struttura (il
record) in 3 diverse funzioni, tanto per vedere se e' proprio la stringa
quella che costituisce il problema
Saluti
Paolo Arosio

 Ma non mi arrendo: la dll non vincera'.
Bravo.
Non ho letto a fondo le altre risposte, per cui la butto li (non si sa
mai...)
Verifica nelle opzioni di compilazione che tipo di allineamento hai. Se la
dll è compilata con un allineamento diverso da quello dell' l'exe,  ottieni
dei comportamenti apparentemente casuali (del tipo che magari solo spostando
posizionalmente i campi all'interno del record riesci a vederli)
Se definisci il record come packed, il compilatore forza l'allineamento ad 1
byte.
Prova ad allineare sia l'exe che la dll ad 1 byte, e vedi se va.
In ogni caso propendo anch'io per il passaggio di un pchar al posto della
stringa.
Non mollare :-)
Ciao.

Ringrazio tutti x l'interessamento e rispondo
in blocco:
1) Non posso passare le vaiabili semplici invece diun tipo
record: i mebri del record sono 32. Per brevita vi ho inviato
del codice di esempio e non quello reale.
2) L'errore non è nella implementazione della classe
che vado ad istanziare.
Ho provato ad assegnare un membro del record ad una variabile
di comodo e si inkazza comuqnue.
3) Dato che arcisicuro che questa dll del c###o sarà 
chiamata solo da exe delphi, non ho voluto stare a smanettare  
con i pchar.
Ieri altri test inutili, ma mi sono quasi convinto
che il codice non ha niente che non va.
Ci deve essere qualche fattore esterno che manda tutto in AV.
Oggi provo a spostare la monnezza sul pc di un mi collega
e vedo se esplode.
Non l'ho ancora fatto xche la roba da spostare è molta
e, prima di perdere troppo tempo, volevo fare tutti i
test possibili&immaginibili + qualcuno in +.
Magari la soluzione la trovo dentro un uovo di pasqua :)))
Intanto, grazie & auguri a tutti, sperando che almeno voi
riusciate a scansare questo venerdi al lavoro.
