Oppure

Loading
14/04/09 19:28
lorenzo
Ho una dll c con queste funzioni

extern "C"{
__declspec(dllexport)double GetValue(char *funzione, double incognita);
}


il codice delphi che la richiama è questo:

procedure TfrmMain.TracciaAssi();
var
  str: String;
  addr: Pointer;
  res: Double;
  val: Double;
  proc: function(funzione: Pointer; incognita: Double):
    Double  cdecl  {$IFDEF WIN32} stdcall {$ENDIF};
  DLLHandle: THandle;
begin
  With desktop do
  begin
    Canvas.MoveTo(0, round(frmMain.Height/ 2) - 25);
    Canvas.LineTo(frmMain.Width, round(frmMain.Height/ 2) - 25);

    Canvas.MoveTo(round(frmMain.Width/ 2), 0);
    Canvas.LineTo(round(frmMain.Width/ 2), frmMain.Height);

    str:= 'sinx';
    val:= 1;
    res:=0;
    addr:= @str;
    DLLHandle:= LoadLibrary('RpNotation.dll');

    if DLLHandle <> 0 then
    begin
      @proc:= GetProcAddress(DLLHandle, 'GetValue');
      if Assigned(proc) then
      begin
        res:= proc(addr,val);
      end
      else
        MessageBox(0,'Errore','Errore',0);
    end;

  end;
end;


in questo modo mi viene un errore di violazione di accesso.
Ho provato ad inserire una MessageBox nella dll per vedere se i paramtri passati arrivavano giusti e non succede, neanche quelli ritornati.

Come posso fare?

edit: il problema di violazione di accesso probabilmente deriva dal fatto che lavorando su una stringa inaspettata la fuzione crasha. Secondo me risolvendo il passaggio dei parametri si risolve anche il problema dell'accesso.
Ultima modifica effettuata da lorenzo 14/04/09 19:30
aaa
15/04/09 15:53
gigisoft
Postato originariamente da lorenzo:

Ho una dll c con queste funzioni

extern "C"{
__declspec(dllexport)double GetValue(char *funzione, double incognita);
}


il codice delphi che la richiama è questo:

[...]


in questo modo mi viene un errore di violazione di accesso.
Ho provato ad inserire una MessageBox nella dll per vedere se i paramtri passati arrivavano giusti e non succede, neanche quelli ritornati.

Come posso fare?

edit: il problema di violazione di accesso probabilmente deriva dal fatto che lavorando su una stringa inaspettata la fuzione crasha. Secondo me risolvendo il passaggio dei parametri si risolve anche il problema dell'accesso.


Puoi postare il codice della funzione "GetValue" ?
Ho il sospetto che l'errore sia dovuto a una diversa gestione dei puntatori a carattere tra C e Delphi

Luigi
aaa
15/04/09 17:14
lorenzo
ti ho allegato i due file che compongono la dll

come si capisce dal nome la dll calcola un valore di incognita da una funzione passata come stringa usando la reverse polish notation
Ultima modifica effettuata da lorenzo 15/04/09 17:15
aaa
18/04/09 16:09
lorenzo
niente...?
aaa
29/04/09 19:08
ylwbrmis
Devi passare le stringhe come pchar.
saluti
aaa
29/04/09 19:15
lorenzo
ho provato ma non funziona

facendo il debug della dll attaccata all'eseguibile delphi ho visto che con il mio codice e con il pchar ho una stringa composta solo dal primo carattere della stringa che ho passato alla dll
aaa
30/04/09 6:42
ylwbrmis
Ho provato a fare cosi e da me funziona mi ritorna 10 in quanto

procedure TForm1.provalafunzione;
type
TCtrlDll = function(puntatore: Pointer; incognita: Double): Double; stdcall;
var
str: string;
addr: Pointer;
res: Double;
val: Double;
DLLHandle: THandle;
CtrlDll: TCtrlDll;
begin
str:= pchar('sinx');
val:= 1;
res:=0;
addr:= @str;
DLLHandle:= LoadLibrary('Funzioneprova.dll');
if (DLLHandle <> 0) then
begin
@CtrlDll := GetProcAddress(DLLHandle, pchar('prova'));
if (@CtrlDll <> nil) then
res:= proc(addr,val);
end
else
MessageBox(0,'Errore','Errore',0);
end;
end;

la funzione "prova" non fa niente ritorna solo un double e la dll "Funzioneprova" e scritta in delphi.
saluti
aaa
30/04/09 11:05
lorenzo
la dll "Funzioneprova" e scritta in delphi.


si ok ma la mia dll è scritta in C non in delphi
aaa