DLL call in Delphi

Posted on 2008-10-13
Last Modified: 2012-05-05
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!)



Question by:monitorwa
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 3
LVL 28

Expert Comment

ID: 22701152
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';

Author Comment

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



LVL 28

Expert Comment

ID: 22709523
just like the parameters...

  command, buffer, cardid:pchar;
  initialize readerhandle with some RDR_ call I suppose
  buffer:='';// whatever
  cardid:='';// whatever
  readcard := RDR_SendCommandGetData(readerhandle, command,buffer,cardid);
  close readerhandle if needed with some other RDR_ call
[Live Webinar] The Cloud Skills Gap

As Cloud technologies come of age, business leaders grapple with the impact it has on their team's skills and the gap associated with the use of a cloud platform.

Join experts from 451 Research and Concerto Cloud Services on July 27th where we will examine fact and fiction.


Author Comment

ID: 22727871
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?


Author Comment

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


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

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



Author Comment

ID: 22763678
I guess Ill just have to put this one down as to hard for everyone!
Thanks to Ciurly but his answers didnt actually work

LVL 28

Accepted Solution

2266180 earned 500 total points
ID: 22765206
sorry. I've been busy and forgot about this one. I have about 4 questions in queue (meaning they are waiting for a few weeks).

that manual stuff looks pretty big so it will probably take me hours to read through, time that I don't have.

what we can do to speed thing up is you posting the c++ code and your translation and me correcting it. like in previous post, corrected translation is:


function RDR_OpenComm(com_port:pchar;autodetect:char;settings:pdcb):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

also, these functions return some stuff. that stuff needs to be valiudated and that will show where the problem is. liek in your code, validating the result of rdr_opencomm should have yelded some errors. I suspect the returned pointer would be nil or pointing to an error structure or whatever. check the manual to see how to check the result of teh functions and where the errors are reported.

then get back to me with the info.

I don't mean to scare you or something, but I have one question which the asker is waiting for me like for 3 or 4 weeks now.
when it comes to more complicated problems that involve me, there are really only 3 possible scenarios:
- some other expert with more free time is pitching in
- the asker works with me so that he does the work and I give the isntructions and correct where needed
- the asker waits until I got time to solve the problem all by myself

these complicated problems take many hours and sometimes days to work on. you can imagine that my free time is not that much. when did you ever had a few days to do nothing and got bored? In my case that was like 10-12 years ago. my free time is what I take from the time allocated to my paid projects which is like a break.

so, bottom line: you cannot solve this by yourself. however, together we can solve it. so help me to help you ;)

Author Comment

ID: 22772743
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

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
There are cases when e.g. an IT administrator wants to have full access and view into selected mailboxes on Exchange server, directly from his own email account in Outlook or Outlook Web Access. This proves useful when for example administrator want…
In this brief tutorial Pawel from AdRem Software explains how you can quickly find out which services are running on your network, or what are the IP addresses of servers responsible for each service. Software used is freeware NetCrunch Tools (https…
Suggested Courses
Course of the Month9 days, 15 hours left to enroll

623 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question