Einzelnen Beitrag anzeigen

Tumm

Registriert seit: 17. Jun 2006
Ort: Celle
171 Beiträge
 
Turbo Delphi für Win32
 
#1

Visual C++ DLL in nutzen - Pointer und Array of Double?

  Alt 15. Sep 2007, 11:25
Hi

Ich habe schon die Suche benutzt und auch schon ein oder zwei Themen zu dem Thema "C++ DLL in Delphi" gefunden. Dort habe ich "erfahren", dass man um Funktionen aus C++ DLLs in Delphi nutzen zu können, zum Beispiel Funktionen wie stdcall nutzen kann.

Bei Funktionen, wo ich nur Integer und Zeiger zu einer Prozedur übergeben musste hat alles noch schön gefunzt:

Code:
function CasioIO_Open(authorId:Integer;productId:Integer;sendproc:tprocedure;receiveprog:tprocedure):hwnd; stdcall; external thedll;
thedll ist hier eine Variable mit dem Namen der DLL.

Code:
CasioIO_Open(3333,3334,@sendproc,@recprog);
Das funktioniert wie gesagt supi. Bei einer anderen Funktion aus der gleichen DLL muss ich nun aber einen Pointer auf einen Integer bzw. ein Array von Kommazahlen (in der Hilfe zu der DLL steht, dass es ein Array of Double sein muss) übergeben. Wenn ich nun einfach den Integer (in den der Rückgabewert rein soll) übergebe kommt eine Zugriffsverletzung (Als Parameter, es kommt nicht als Rückgabewert!). Wenn ich einen ganz normalen Pointer sende, kommt schon beim Starten der Anwendung eine Zugriffsverletzung wegen external und so.

Mit "cdecl" statt "stdcall" funktioniert es auch nicht .


Der Visual C++ Aufruf müsste so lauten (steht in der Hilfe der DLL):
Code:
int WINAPI CasioIO_AfterSend(

int handle,
unsigned char * datatype,
unsigned char * name,
unsigned char * rows,
unsigned char * columns,
double * values,
);
Die Parameterbeschreibung aus der Hilfe:
Zitat:
handle
This is the value which is returned by CasioIO_Open.

datatype
Pointer to a byte where to store the datatype. When the function returns, it will contain 1 for variables, 2 for matrices or 3 for lists.

name
Pointer to a byte where to store the name.

rows
Pointer to a byte where to store the number of rows. When the functions returns, it will contain the number of rows. For variables, this is 1.

columns
Pointer to a byte where to store the number of columns. When the functions returns, it will contain the number of rows. For variables and lists, this is 1.

values
Pointer to an array of doubles (double precision floating points) where to store the values of the variable, lists or matrix. Make sure the array is large enough to contain all the values.

Ich habe es so probiert:

Code:
function CasioIO_Aftersend(handle:INteger;datatype:byte;name:byte;rows:byte;columns:byte;values:array of Double):Integer; cdecl; external thedll;
(Mit ganz "normalen" Integern hat es auch nicht funktioniert)

Tumm
Code Gear = Kot Gier
  Mit Zitat antworten Zitat