Newsgroup: it.comp.lang.delphi
Titolo: utilizzo dll non delphi con parametri

Ciao a tutti,
  sto cercando di utilizzare una dll credo scritta in C e ho qualche
difficoltà con il passaggio di parametri.
Ho visto che ci sono molti post riguardanti errori nel passaggio di
parametri ma non riesco proprio a capire dove sbaglio.
Questo è l'inizio del file .h:
#ifndef _FAXAPI_H_
#define _FAXAPI_H_
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifndef WIN32
#ifndef APIENTRY
#define APIENTRY WINAPI
#endif
#ifndef CHAR
#define CHAR char
#endif
...... qui ci sono le specifiche dei parametri
// destination structures
typedef struct _DESTREC
{
	CHAR	szLastName[20];		// last name
	CHAR	szFirstName[20];		// first name
	CHAR	szCompany[32];		// company name
	CHAR	szFaxNum[64];		// fax dial number
	CHAR	szMatterCode[22];		// client-matter code
} DESTREC, *PDESTREC, FAR *LPDESTREC;
typedef struct _FILEREC
{
	CHAR	szFileName[80];			// path to file
	CHAR	szFontName[32];			// font used for ASCII files
	DWORD	dwFileType;			// file type
	DWORD	dwResolution;			// send resolution
	DWORD	dwDeleteFlags;			// deletion flags
	BOOL	fSeam;				// seam with next file
	BOOL	fScale;				// scale image to fax width
} FILEREC, *PFILEREC, FAR *LPFILEREC;
Nel mio programma in delphi ho fatto così:
...
...
type
  Tdestrec = record
    szfirstname:string;
    szlastname:string;
    szcompany:string;
    szfaxnum:string;
    szMatterCode:string;
  end;
type
  Tfilerec = record
    szfilename:string;
    szfontname:string;
    dwfiletype:dword;
    dwresolution:dword;
    dwdeleteflags:dword;
    fseam:boolean;
    fscale:boolean;
  end;
...
...
Function SchedAddDest(hfax,hsched:Longint;destrec:Tdestrec):Boolean;
stdcall; External 'faxapi32.dll';
Function SchedAddFile(hfax,hsched:Longint;filerec:Tfilerec):Boolean;
stdcall; External 'faxapi32.dll';
...
...
procedure TForm1.destinatarioClick(Sender: TObject);
var destrec:Tdestrec;
begin
  with destrec do
  begin
    szfirstname:='First Name';
    szlastname:='Last Name ';
    szcompany:='Company';
    szfaxnum:='00390123456789';
  end;
  if not SchedAddDest(hfax,hsched,destrec) then
  begin
    beep;
    messagedlg('Fax schedadddest failed.' + chr(10) +
IntToStr(FaxGetLastError), mterror, [mbok], 0);
    SchedCancel(hfax,hsched);
    FaxLogoff(hfax);
  end
  else
  begin
    memo1.Lines.Add('Destinatario aggiunto');
  end;
end;
procedure TForm1.nomefileClick(Sender: TObject);
var filerec: Tfilerec;
begin
  with filerec do
  begin
    szfilename:='C:\fax.rtf';
    szfontname:='Courier 12';
    dwfiletype:=0;
    dwresolution:=1;
    dwdeleteflags:=1;
    fseam:=false;
    fscale:=true;
  end;
  if not SchedAddFile(hfax,hsched,filerec) then
  begin
    beep;
    messagedlg('Fax schedaddfile failed.' + chr(10) +
IntToStr(FaxGetLastError), mterror, [mbok], 0);
    SchedCancel(hfax,hsched);
    FaxLogoff(hfax);
  end
  else
  begin
    memo1.Lines.Add('File aggiunto');
  end;
end;
...
...
La procedura "destinatario" funziona e mi restituisce un valore TRUE
mentre la procedura "nomefile" mi restituisce un errore
"FAXERR_INVALIDPARAM"
Ciao e grazie a tutti.

 stdcall; External 'faxapi32.dll';
 > Function SchedAddFile(hfax,hsched:Longint;filerec:Tfilerec):Boolean;
 > stdcall; External 'faxapi32.dll';
Mio dubbio: sei sicuro che i parametri siano di tipo TDestrec e 
TFilerec? Di solito in c si usa passare dei puntatori piuttosto che 
intere strutture. In quel caso la tua dichiarazione non e' corretta.
Controlla la dichiarazione in c delle funzioni per sicurezza.
ciao
Giacomo

 Controlla la dichiarazione in c delle funzioni per sicurezza.
Questo l'ho copiato dal file .h
BOOL APIENTRY SchedAddFile(HFAX, HSCHED, LPFILEREC);
BOOL APIENTRY SchedAddDest(HFAX, HSCHED, LPDESTREC);
Questo è quello che c'è nelle istruzioni:
- SchedAddDest
BOOL SchedAddDest(
	HFAX hFax,		// fax server handle
	HSCHED hSched,		// schedule event handle
	LPDESTREC lpDestRec	// destination/recipient information record
	);
Parameters
hFax	Fax server session handle.
hSched	Schedule event handle.
lpDestRec	Destination information record describing the recipient to be
added to the specified schedule event.
Return Value
This function will return TRUE on success, FALSE otherwise.
- SchedAddFile
BOOL SchedAddFile(
	HFAX hFax,		// fax server handle
	HSCHED hSched,		// schedule event handle
	LPFILEREC lpFileRec	// file information record
	);
Parameters
hFax	Fax server session handle.
hSched	Schedule event handle.
lpFileRec	File information record describing the file to be added to
the specified schedule event.
Return Value
This function will return TRUE on success, FALSE otherwise.
Ciao e grazie.

 BOOL APIENTRY SchedAddDest(HFAX, HSCHED, LPDESTREC);
Come temevo: le funzioni ricevono dei puntatori mentre tu passi degli 
interi record.
Probabilmente l'access sparisce modificando in questo modo:
{$A4}
type
   Tdestrec = record
   ...
   end;
   PDestRec = ^TDestRec;
   LPDestRec = ^TDestRec;
...
Function SchedAddDest(hfax,hsched:Longint;destrec:LPDestRec):Boolean; 
stdcall; External 'faxapi32.dll';
con il parametro di tipo LPDestRec al posto di TDestRec
(idem per l'altro record/funzione)
ciao
Giacomo

 
Grazie mille ora funziona!
M.