Link to home
Start Free TrialLog in
Avatar of monitorwa
monitorwa

asked on

DLL call in Delphi

Hi all,
I am trying to write some functions for a dll which means I need to declare the function, and call the function - sorry im not very good at these!
I have an example piece of code which was written in C++ and this is how it calls the function
 RDR_SendCommandGetData(reader_handle, "select", "", buffer);

I have details on how what the functions requires here

RDR_SendCommandGetData // this is the function name
The RDR_SendCommandGetData function sends a command to a reader specified by its
handle and receives data.


Win char* RDR_SendCommandGetData(void* hReader, char* command, char* / this is some kind of declaration or description on the function
data, char* buffer);

Parameter Description // next are the defination of the variables required.
hReader:      Handle of reader to send a command.
command: 0 terminated string with the command e,g one of the commands I know is "select"
data: ASCII 0 terminated string containing the data
                  BIN length of data (1 byte) + data  // note when using the select command there is no data
buffer: A buffer of the return value.
                        ASCII protocol: The buffer size has the range of 514 bytes.
                        BIN protocol: The buffer size has the range of 256 bytes.
                        
I am getting confused with the char variable types and think they need to be pointers or something like that, I have put my code below but please appreciate it is wrong as I have been trying allsorts

function declared

function RDR_SendCommandGetData(readerhandle:integer;command:pointer;data:pointer;cardid:pointer):integer; stdcall; external 'Reader.dll' name 'RDR_SendCommandGetData'; // gets card ID

Im trying to call it as follows

readcard := RDR_SendCommandGetData(readerhandle, @command,@buffer,@cardid);
I have set command,buffer, and cardid as string type variables.

I really appreciate any help as my normal programmer is on leave and Im trying to sort this on my own (fat chance without you guys!)

thanks

Dave




                        
                        
                        
                        
Avatar of 2266180
2266180
Flag of United States of America image

Win char* RDR_SendCommandGetData(void* hReader, char* command, char* data, char* buffer);

translates to

function RDR_SendCommandGetData(hReader:pointer; command:pchar; data:pchar; buffer:pchar):pchar; stdcall; external 'dll_name_here.dll';
Avatar of monitorwa
monitorwa

ASKER

Thanks ciuly - I dont suppose you could add how you call the function and declare the variables?

thanks

Dave

just like the parameters...

var
  readcard:pchar;
  readerhandle:pointer;
  command, buffer, cardid:pchar;
begin
  initialize readerhandle with some RDR_ call I suppose
  command:='select';
  buffer:='';// whatever
  cardid:='';// whatever
  readcard := RDR_SendCommandGetData(readerhandle, command,buffer,cardid);
  close readerhandle if needed with some other RDR_ call
end;
sorry for the slow response, I have been trying all sorts of things with no success. I have done exactly as you listed above and keep getting an access violation at address 000000

Any odeas?

thanks
Dave
ok I think it may be from the way I had opened the port and reader, the instructions process is as follows

RDR_OpenComm
RDR_DetectReader
RDR_OpenReader
RDR_SendCommand
RDR_GetData
RDR_CloseReader
RDR_CloseComm

and the C++ definition is as follows

void* RDR_OpenComm(char* device, char autodetect, struct
presetSettings* settings);

char* RDR_DetectReader(void* hComm, char* buffer);

void* RDR_OpenReader(void* hComm, unsigned char id, short
knownReader);

char* RDR_SendCommandGetData(void* hReader, char* command, char*
data, char* buffer);


My attempts that dont work are as follows  - first the defination
function RDR_OpenComm(com_port:pchar;autodetect:char;settings:tdcb):pointer; stdcall; external 'Reader.dll' name 'RDR_OpenComm'; // returns port handle
function RDR_DetectReader(porthandle:pointer;detect_buffer:pchar):pchar; stdcall; external 'Reader.dll' name 'RDR_DetectReader'; // returns reader handle

and called as follows

com_port := 'com4';
porthandle := RDR_OpenComm(com_port,'1',structure);
RDR_DetectReader(porthandle, detect_buffer);


vars are
structure: tdcb;
com_port : pchar;
readerhandle,porthandle,  readeropen : pointer;
reply, command1,data,buffernew : string;
readcard :pchar;
command, buffer, cardid , detect_buffer , readerhand:pchar;


I have also attached the document that list all of these and more - Im really struggling here, it appears to get the com handle ok but cant get past the next stage

thanks

Dave





Reader-DLL-V3-3-0-User-Manual-03.zip
I guess Ill just have to put this one down as to hard for everyone!
Thanks to Ciurly but his answers didnt actually work

Dave
ASKER CERTIFIED SOLUTION
Avatar of 2266180
2266180
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Hi Ciuly,
I really appreciate your assistance so far and fully understand what you are saying - yea who gets spare time, certainly not me either! What I will do is award you the points as I am sure we would get there int he end but I dont need to waste your time anymore as my developer has come back from holidays and I think he has it all working now. I was really just trying to get a better understanding of these things but its not important enough for you to spend a lot of time trying to more or less teach me, so thanks again and maybe you will help with other questions I have