Hallo,
ich muss auf eine dll zugreifen, zu der es nur einen C-Header gibt. Da ich C-Analphabet bin und in Delphi auch noch nichts mit dlls gemacht habe, habe ich es mit Dr. Bob's automatischem Konvertierer headconv versucht. Der erzeugte Code lässt sich aber nicht einmal compilieren. Wer kann mir weiter helfen?
Hier die einigermassen knappe C-Headerdatei:
class VNADevice
{
private:
bool Result; // DeviceIoControl result
int state; // -1=no device +1=device OK
class Helper * d; // holds the USB device state
void GetHandle(void);
void ReleaseHandle(void);
bool ToggleReset(bool hold);
public:
__declspec(dllexport) VNADevice(); // Constructor: open device,
// set state
__declspec(dllexport) ~VNADevice(); // Destructor: release objects and
// structs
__declspec(dllexport) bool Init(void); // Build descriptors, get pipes
__declspec(dllexport) int get_State(); // -1 = no device +1 = device OK
__declspec(dllexport) bool Start(); // Release reset of the 8051
// processor on VNA
__declspec(dllexport) bool Stop(); // Halt the 8051 processor on VNA
__declspec(dllexport) int get_Instance(); // get instance of VNA (0..9)
__declspec(dllexport) bool set_Instance(int instance); // set instance (0..9) __declspec(dllexport) int get_BytesReturned();
__declspec(dllexport) bool Read(VNA_RXBUFFER * readbuf);
__declspec(dllexport) bool Write(VNA_TXBUFFER * writebuf, int message_size);
};
// emulation of parallel port driver interface
bool __declspec(dllexport) _stdcall Out32(short PortAddress, short data);
WORD __declspec(dllexport) _stdcall Inp32(short PortAddress);
// simple VNA usb interface
bool __declspec(dllexport) _stdcall vnawrite(void *message, short bytecount);
bool __declspec(dllexport) _stdcall vnaread(void *message, short *bytecount);
Und hier, was headconv daraus gemacht hat:
unit VNADLL;
{**************************************************************************}
{ }
{ This C DLL header file first (automatic) conversion generated by: }
{ HeadConv 4.0 (c) 2000 by Bob Swart (aka Dr.Bob - www.drbob42.com) }
{ Final Delphi-Jedi (Darth) command-line units edition }
{ }
{ Generated Date: 29.04.2009 }
{ Generated Time: 22:49:06 }
{ }
{**************************************************************************}
interface
uses
{$IFDEF WIN32}
Windows;
{$ELSE}
Wintypes, WinProcs;
{$ENDIF}
{=> d:\delphidll\headconv\VNADLL.H <=}
var
GetHandle: procedure cdecl {$IFDEF WIN32} stdcall {$ENDIF};
var
ReleaseHandle: procedure cdecl {$IFDEF WIN32} stdcall {$ENDIF};
var
ToggleReset: function(hold: Bool): Bool cdecl {$IFDEF WIN32} stdcall {$ENDIF};
var
__declspec: function(VNADevice(: var DLLEXPORT)): UBLIC: cdecl {$IFDEF WIN32} stdcall {$ENDIF};
{/// set state }
var
__declspec: function(~VNADevice(: DLLEXPORT)): Integer cdecl {$IFDEF WIN32} stdcall {$ENDIF};
{/// structs }
var
__declspec: function(Init(void: DLLEXPORT) BOOL): Integer cdecl {$IFDEF WIN32} stdcall {$ENDIF};
var
__declspec: function(get_State(: DLLEXPORT) INT): Integer cdecl {$IFDEF WIN32} stdcall {$ENDIF};
var
__declspec: function(Start(: DLLEXPORT) BOOL): Integer cdecl {$IFDEF WIN32} stdcall {$ENDIF};
{/// processor on VNA }
var
__declspec: function(Stop(: DLLEXPORT) BOOL): Integer cdecl {$IFDEF WIN32} stdcall {$ENDIF};
var
__declspec: function(get_Instance(: DLLEXPORT) INT): Integer cdecl {$IFDEF WIN32} stdcall {$ENDIF};
var
__declspec: function(instance: DLLEXPORT) BOOL SET_INSTANCE(INT): Integer cdecl {$IFDEF WIN32} stdcall {$ENDIF};
var
__declspec: function(var readbuf: DLLEXPORT) BOOL READ(VNA_RXBUFFER): Integer cdecl {$IFDEF WIN32} stdcall {$ENDIF};
var
__declspec: function(var writebuf: DLLEXPORT) BOOL WRITE(VNA_TXBUFFER;
message_size: Integer): Integer cdecl {$IFDEF WIN32} stdcall {$ENDIF};
{/// emulation of parallel port driver interface }
var
__declspec: function(PortAddress: DLLEXPORT) _STDCALL OUT32(SHORT;
data: SmallInt): Bool cdecl {$IFDEF WIN32} stdcall {$ENDIF};
var
__declspec: function(PortAddress: DLLEXPORT) _STDCALL INP32(SHORT): Word cdecl {$IFDEF WIN32} stdcall {$ENDIF};
{/// simple VNA usb interface }
var
__declspec: function(var message: DLLEXPORT) _STDCALL VNAWRITE(VOID;
bytecount: SmallInt): Bool cdecl {$IFDEF WIN32} stdcall {$ENDIF};
var
__declspec: function(var message: DLLEXPORT) _STDCALL VNAREAD(VOID;
var bytecount: SmallInt): Bool cdecl {$IFDEF WIN32} stdcall {$ENDIF};
var
DLLLoaded: Boolean { is DLL (dynamically) loaded already? }
{$IFDEF WIN32} = False; {$ENDIF}
implementation
var
SaveExit: pointer;
DLLHandle: THandle;
{$IFNDEF MSDOS}
ErrorMode: Integer;
{$ENDIF}
procedure NewExit; far;
begin
ExitProc := SaveExit;
FreeLibrary(DLLHandle)
end {NewExit};
procedure LoadDLL;
begin
if DLLLoaded then Exit;
{$IFNDEF MSDOS}
ErrorMode := SetErrorMode($8000{SEM_NoOpenFileErrorBox});
{$ENDIF}
DLLHandle := LoadLibrary('VNADLL.DLL');
if DLLHandle >= 32 then
begin
DLLLoaded := True;
SaveExit := ExitProc;
ExitProc := @NewExit;
@GetHandle := GetProcAddress(DLLHandle,'GetHandle');
{$IFDEF WIN32}
Assert(@GetHandle <> nil);
{$ENDIF}
@ReleaseHandle := GetProcAddress(DLLHandle,'ReleaseHandle');
{$IFDEF WIN32}
Assert(@ReleaseHandle <> nil);
{$ENDIF}
@ToggleReset := GetProcAddress(DLLHandle,'ToggleReset');
{$IFDEF WIN32}
Assert(@ToggleReset <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
@__declspec := GetProcAddress(DLLHandle,'__declspec');
{$IFDEF WIN32}
Assert(@__declspec <> nil);
{$ENDIF}
end
else
begin
DLLLoaded := False;
{ Error: VNADLL.DLL could not be loaded !! }
end;
{$IFNDEF MSDOS}
SetErrorMode(ErrorMode)
{$ENDIF}
end {LoadDLL};
begin
LoadDLL;
end.
Der Delphicompiler verarbeitet nur die ersten drei var-Deklarationen fehlerfrei.
Danke und viele Grüße,
Thomas