Newsgroup: it.comp.lang.delphi
Titolo: Codice DLL : dove sbaglio ???

Lo scopo di questa DLL è quello di controllare l'esistenza di un alias
specifico : se non lo trovo ==> lo creo ! Ora il problema risiede nel fatto
che non capisco perché mi restituisca sempre false anche quando ho inserito
l'alias manualmente.
************
unit DllAlias;
interface
uses
    Dialogs,Classes,DBTables,SysUtils;
   function Cerca_Alias(Alias:string):boolean;stdcall;
   function Crea_Alias(Alias:string;path:string;
          Parametri:TStringList):boolean;stdcall;
implementation
function Cerca_Alias(Alias:string):boolean;stdcall;
var
   i : integer;
   ListaAlias:TstringList;
begin
     ListaAlias:=TStringList.Create;
     Cerca_Alias:=false;
     try
        with session do begin
             active:=true;
             configmode:=cmAll;
             GetAliasNames(ListaAlias);
        end;
        for i:=0 to ListaAlias.count-1 do
            if ListaAlias[i]=Alias then begin
               showmessage ('Attenzione l''ho trovato');
               Cerca_Alias:=true;
               break;
            end
     finally
            ListaAlias.free;
     end;
end;
end
*******************************
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
type
  TCercaAlias=function(Alias:string):boolean;
  TCreaAlias =function(Alias:string;path:string;
          Parametri:TStringList):boolean;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    DLLHandle:THandle;
    CercaAlias:TCercaAlias;
    CreaAlias:TCreaAlias;
    procedure ApriDll;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
     button1.caption:='CercaAlias';
     ApriDll;
end;
procedure TForm1.ApriDll;
begin
     DLLHandle:=LoadLibrary('PDllAlias');
     if DLLHandle<>0 then begin
        @CercaAlias:=GetProcAddress(DLLHandle,'Cerca_Alias');
     end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
   result : boolean;
begin
     result:=CercaAlias('Prova1');
     case result of
     true :
        showmessage('vero');
     false :
        showmessage('falso');
     end;
     if not result then
end;
end.
***************************
Grazie !

end;
ciao Michele, non ho letto tutto il codice perchè sono di fretta, ma mi sono
limitato solo alla funzione nella DLL.
Secondo me c' è un errore (sempre se io non sono fuso già a quest'
ora......ma è difficile !! eheh).
In pratica nella funzione hai scritto:
for i:=0 to ListaAlias.count-1 do
 if ListaAlias[i]=Alias then begin
ok, sembra tutto giusto, ma chi ti assicura che la stringa che gli passi è
scritta uguale (maiuscole e minuscole) rispetto alla stringa della lista ?
Al limite scrivi:
for i:=0 to ListaAlias.count-1 do
  if UpperCase(ListaAlias[i]) = UpperCase(Alias) then begin
poi per vedere se l' errore è nel codice della form o quello della DLL,
dimmi una cosa: ti compare il messaggio generato dalla riga di codice :
showmessage ('Attenzione l''ho trovato');
scritta nella funzione della DLL ?
Ok, ci sentiamo. Cmq se non erro nella classe TSession ci sono altre
funzioni per controllare l' esistenza di un alias specifico !!
Ciaooo !!
Antonio Tarolla
BSSoftware Tips Mailing - List Support


Ok : il problema sembra essere il valore che viene passato alla funzione
Cerca_Alias : se guardo il valore della var Alias ne ottengo una serie di
caratteri illegibili che non hanno nulla a che fare con quello che volevo
controllare ! Per questo motivo il messaggio "l'ho trovato" della dll non
viene visualizzato ! Non è che tutto questo casino sia frutto di quella
famosa SHAREMEM ? Se si, allora, ogni volta che avrò bisogno di una dll
contenente delle funzioni a cui passare delle stringhe sarò costretto a
distribuire anche la BORLNDMM.DLL ? Insomma io non ce sto capendo un kaiser
! Il bello delle dll ho sempre pensato fosse quello di poterle ri-utilizzare
delle routine cosiddette "rognose", quelle che rompe di più scrivere in ogni
applicativo, ma se sono costretto a utilizzare "trucchi" per poterle
utilizzare, allora 'ndo sta il vantaggio ????
Ciao e scusate lo sfogo !

utilizzare, allora 'ndo sta il vantaggio ????
oggi proprio non ci ho fatto caso alla testata della funzione. L' errore era
proprio li !! (ora non so se ce ne sono altri.....ma quello è il più
"grosso")
Per passare una stringa alla DLL, io uso PChar e non cado in questo
inconveniente.
Poi nella DLL fai di nuovo la conversione e riottieni la stringa !!
Cioè devi dichiarare il parametro tipo PChar e passarglirlo come PChar.
Poi all' interno della funzione fai la conversione. Mi sono spiegato ?
SHAREMEM la usano per fare queste cose, ma io vado con PChar !!
Ti saluto....ciao !!


 distribuire anche la BORLNDMM.DLL ? Insomma io non ce sto capendo un
kaiser
Purtroppo è così. Almeno le applicazioni che ho finora distribuito hanno
necessitato della libreria delphimm.dll. Senza di quella la procedura che
carica le dll non riesce a trovare le librerie chiamate.
--
saluti
FDA

 Cioč devi dichiarare il parametro tipo PChar e passarglirlo come PChar.


carica le dll non riesce a trovare le librerie chiamate.
quindi tutto il problema sta nel passare una stringa ad una DLL e se usi
sharemem devi distribuire la libreria DELPHIMM.DLL o come si chiama. Giusto
?
Premetto che non ho mai usato questa SHAREMEM ma pensate una cosa.
Se le API di Windows vogliono come parametro un PChar per passargli una
stringa, anche noi possiamo far la stessa cosa.
Come ho detto a Michele, si può dichiarare il parametro della DLL di tipo
PChar e passargli la stringa come PChar ovviamente. (insomma fai finta che
la tua funzione della DLL sia un' API in tutti i sensi)
Ora all' interno della DLL (nella tua funzione per capirci) puoi usare
StrPas per fare una conversione a stringa,
cioè convertire il parametro della funzione da PChar a stringa pascal. O no
?
A me funge il sistema e credo anche a voi !!
Poi con le stringhe e le DLL ho notato altre cose un po' strane.
Ok, vi saluto.....ciao !!


Grazie e scusa ancora
e di che......spero di esserti stato d' aiuto !!
riguardo l' esistenza di un alias nel BDE, mi pare che in TSession c' è la
funzione "IsAlias"....controlla !!
Ti saluto......ciao !!


 Ok, vi saluto.....ciao !!


 Ti saluto......ciao !!


Grazie ancora Antonio
REGISTER dovrebbe ( se non erro ) servire per passare i parametri tramite i
registri.
Comunque a me questo "inconveniente" non si verifica.
Nella DLL scrivo il codice per come l' hai scritto tu, o come te l' avevo
suggerito e poi nel DPR sotto exports dichiaro le funzioni da esportare.
Ho dato un' occhiata al tuo codice che richiama la funzione della DLL e devo
dire che io faccio un po' diversamente.....diciamo che semplifico le cose.
In pratica tutta questa parte:
DLLHandle:=LoadLibrary('PDllAlias');
     if DLLHandle<>0 then begin
        @CercaAlias:=GetProcAddress(DLLHandle,'Cerca_Alias');
     end;
non la uso "mai"......poi nel tuo codice devi anche aggiungere "FreeLibrary"
quando chiudi la libreria.
Quando utilizzi FreeLibrary devi passargli l' istanza che ti aveva
restituito
precedentemente la LoadLibrary. Ok ?
"LoadLibrary" la utilizzo ad esempio quando mi serve l' istanza della DLL
per prelevare una risorsa ecc....
altrimenti vado subito al sodo, cioè:
var Risultato:Boolean;
begin
  Risultato:=CercaAlias(PChar('Prova1'));
  if Risultato then
   ShowMessage('Alias trovato')
  else ShowMessage('Alias non trovato');
end;
e sopra la clausola implementation (esternamente al type della classe )
dichiaro la funzione come:
function CercaAlias( Alias: PChar ):Boolean;stdcall;external 'Nomedll.dll';
e tutto funziona senza problemi (almeno....funzionava !! eheh).
Comunque ripensa sempre alle API e al limite guardati il file "Windows.pas"
dove c' è "molto" da imparare !!
Ok, ti saluto.
Buon lavoro.....ciao !!


inconveniente.
Si potrebbero usare le ShortString che non creno i problemi delle
string, dovrebbero essere presenti da D2 in poi, o sbaglio?
Ciao
--
Piero Bonanno
bop...@libero.it
pie...@tiscalinet.it
bop...@tin.it
bpie...@hotmail.com
______________________________________________
"Madame, lei ha tra le gambe uno strumento
che puo' offrire piacere a migliaia di persone,
e tutto quello che sa fare e' grattarlo"
- Sir Thomas Beechan a una violoncellista