AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Visual C++ DLL in nutzen - Pointer und Array of Double?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Tumm · begonnen am 15. Sep 2007 · letzter Beitrag vom 16. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
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, 12: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
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 15. Sep 2007, 13:30
wenn ein Pointer auf ein Byte erwartet wird darfst du nicht einfach ein normale Byte nehmen sondern eben einen Pointer auf ein Byte. Dudem ist ein dynamisches Array in Delphi etwas ganz anderes als ein Array in C
function CasioIO_Aftersend(handle: Integer; datatype, name, rows, columns: pbyte; values: PDouble):Integer; stdcall; external thedll; wenn du nicht so fitt in c bist nehm einfach mal einen Header-convertierer der automatisch aus C-Headern Delphi-Header macht. Und dann schau dir an was der Converter gemacht hat um zu verstehen was die einzelnen Dinge in C bedeuten.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

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

  Alt 15. Sep 2007, 13:39
Ich denke den Parameter als Var-Parameter zu übergeben sollte auch helfen.
Delphi-Quellcode:
function CasioIO_Aftersend(handle: Integer;
  var datatype : Byte;
  var name : Byte;
  var rows : Byte;
  var columns: Byte;
  var values: Double):Integer; stdcall; external thedll;
Hat den Vorteil, dass man seine "normalen" Variablen nehmen und damit arbeiten kann. Mit dem Zeigergedöns verhaspelt man sich schneller.
Glaub ich zumindest.

Gruß oki
42
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

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

  Alt 15. Sep 2007, 13:46
In Delphi ein dynamisches Array zu nehmen sollte aber funktionieren, denn das ist ein Zeiger auf das erste Element.
Problematisch wird nur, dass man die Größe des Arrays vorher festsetzen muss, aber das muss man bei den Zeigern auch. Und mit var zu arbeiten bringt beim Array meiner Meinung nach kaum etwas.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

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

  Alt 15. Sep 2007, 13:49
beim letzten parameter könnte es zu problemen kommen oder kann man dort das 0te Elemten eines arrays übergeben ohne das der Compiler meckert.
Bei den anderen Parametern ist die Verwendung von var wirklich sinnvoll. Aufpassen muss man erst dann (was hier nicht der vall ist) wenn man einne Parameter übergeben kann aber nicht muss. Dann ist die Verwendung von Pointern (wo man nil) übergeben kann einfacher zu tippen als wenn die Declaration mit var ist.

Ein dynamisches Array ist ein zeiger auf das erste Element? Das wäre mir neu aber ausschließen kann ich es nicht. Trotzdem sollte man darauf nicht aufbauen sonst kommt man in schwierigkeiten wenn das mal bei einer Delphiversion geändert wird. Man sollte immer die Adresse des ersten Array-Elementes übergeben.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 15. Sep 2007, 13:53
Was ich an dieser Implementation echt dämlich finde:
Zitat:
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.
Gibt es keine Funktion, mit der man den zu reservierenden Speicher vorher ermitteln kann?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

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

  Alt 15. Sep 2007, 14:18
Zitat:
Ein dynamisches Array ist ein zeiger auf das erste Element? Das wäre mir neu aber ausschließen kann ich es nicht.
Man muss sich die Operationen mal im CPU-Fenster anschauen, dann sieht man es deutlich. Und ehrlich gesagt wüsste ich nicht, was sich daran ändern könnte - wie willst du denn dynamische Arrays ohne Zeiger implementieren?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Tumm

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

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

  Alt 15. Sep 2007, 14:25
Ähh also ich hatte versucht auf ein statisches Array zu zeigen.

Danke für die vielen Tipps !

Ich habe
Delphi-Quellcode:
  function CasioIO_Aftersend(handle: Integer;
  var datatype : Byte;
  var name : Byte;
  var rows : Byte;
  var columns: Byte;
  var values: Double):Integer; stdcall; external thedll;
von Oki versucht. Leider kam aber beim Programmstart eine Zugriffsverletzung .

[EDIT]Sir Thomberys Vorschlag hat leider auch nicht funktioniert. Allerdings hab ich die Sache mit dem Pointer auf ein Byte bei einer anderen Funktion aus der DLL probiert; dort muss man nur Integer übergeben. Da hat sie (natürlich) gefunzt (THX!). Liegt das an diesem Array of Double?[/EDIT]
Code Gear = Kot Gier
  Mit Zitat antworten Zitat
Tumm

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

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

  Alt 15. Sep 2007, 15:35
ich habe eben noch weiter probiert. In der DLL gibt es eine zweite Funktion, bei der man auch ein Double-Array übergeben muss. Dort hab ich es mit nur einem Double (statt einem Array) gemacht und es hat gefunzt ! Aber bei CasioIO_AfterSend geht es immer noch nich .

CasioIO_AfterSend(hand,@dtype,@dname,@rows,@columns,@val2[0]); (geht nich )
(val2 ist ein Array (Double), die anderen sind bis auf hand alles bytes)
Code Gear = Kot Gier
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#10

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

  Alt 15. Sep 2007, 22:47
Sorry,
das mit dem Array hatte ich übersehen. Da stimme ich SirThornberry zu. Elemente als Array of Double.
Delphi-Quellcode:
function CasioIO_Aftersend(handle: Integer;
  var datatype : Byte;
  var name : Byte;
  var rows : Byte;
  var columns: Byte;
  values: Pointer):Integer; stdcall; external thedll;
Mit dem Thema dynamisches Array bin ich mir nicht ganz sicher, aber ich glaube es war so:

Statisches Array: (hierbei bin ich mir ziemlich sicher)
Delphi-Quellcode:
var Myhandle: Integer;
  datatype : Byte;
  name : Byte;
  rows : Byte;
  columns: Byte;
  values: Array[0..5] of Double;
begin
  .... // Zuweisung der Werte
  CasioIO_Aftersend(Myhandle, datatype, name, rows, columns, @values[0]);
end;
Dynamisches Array: (hier bin ich mir nicht sicher)
Delphi-Quellcode:
var Myhandle: Integer;
  datatype : Byte;
  name : Byte;
  rows : Byte;
  columns: Byte;
  values: Array of Double;
begin
  SetLength(values, 5);
  .... // Zuweisung der Werte
  CasioIO_Aftersend(Myhandle, datatype, name, rows, columns, values[0]);
end;
Gruß oki
42
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz