Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dll Aufruf übersetzen (https://www.delphipraxis.net/88966-dll-aufruf-uebersetzen.html)

ebber 23. Mär 2007 17:23


Dll Aufruf übersetzen
 
Hallo

ich habe hier etwas was ich mit Delphi machen will.
Es ist um eine Dll Funktion aufzurufen.

Das hatte ich so umgeformt und das geht.

Delphi-Quellcode:

dpSetDevMonitorAtten(
   int   iDeviceNum,
   DWORD dwChannelID,
   int   iNewVolume
);


procedure dpSetDevMonitorAtten(iDeviceNum:integer; dwChannelID:Dword; iNewVolume:integer);
stdcall; external 'DELTAPNL.DLL';
Das ist nur um etwas zu Setten aber das hier soll nun einen Wert zurückgeben.

Delphi-Quellcode:

dpGetDevMonitorAtten(
   int   iDeviceNum,
   DWORD dwChannelID,
   int  *piVolume
);
Ich habe das jetzt so probiert, aber das geht nicht.

Delphi-Quellcode:

function dpGetDevMonitorAtten(iDeviceNum:integer; dwChannelID:Dword; piVolume:Integer):dword;
stdcall; external 'DELTAPNL.DLL';
Hat vermztlich was mit dem *pivolume zu tun ?

MfG

Robert Marquardt 23. Mär 2007 17:31

Re: Dll Aufruf übersetzen
 
Delphi-Quellcode:
function dpGetDevMonitorAtten(iDeviceNum:integer; dwChannelID:Dword; var piVolume:Integer): dword;
stdcall; external 'DELTAPNL.DLL';
* ist hier mit var gleichzusetzen. Es koennte auch ein echter Zeiger sein, aber die Funktions- und Parameternamen machen dies unwahrscheinlich.
Sollte wirklich der Rueckgabetyp der C-Funktinoen fehlen (steht vor dem Funktionsnamen), so ist der Rueckgabetyp implizit Integer und nicht DWORD.

Christian Seehase 23. Mär 2007 17:33

Re: Dll Aufruf übersetzen
 
Moin ebber,

also ich würde das so übersetzten:

Delphi-Quellcode:
dpSetDevMonitorAtten(int iDeviceNum,DWORD dwChannelID,int iNewVolume);
// wird zu
function dpSetDevMonitorAtten(const iDeviceNum : integer;const dwChannelID : DWORD;const iNewVolume : integer) : integer; stdcall; external ...
// und
dpGetDevMonitorAtten(int iDeviceNum,DWORD dwChannelID,int *piVolume);
// wird zu
dpGetDevMonitorAtten(const iDeviceNum : integer;const dwChannelID : DWORD;const piVolume : PInteger) : DWORD; stdcall; external...
// Alternative
dpGetDevMonitorAtten(const iDeviceNum : integer;const dwChannelID : DWORD;var piVolume : PInteger) : DWORD; stdcall; external...
Du musst dann für piVolume aber auch die Adresse übergeben (@IntegerVariableDieDenWertErhaelt, 1. Variante) oder eben eine Variable (2. Variante)

ebber 23. Mär 2007 17:50

Re: Dll Aufruf übersetzen
 
Das mit dem dword war ein versehen ich hatte da nur rumprobiert.
Const könnte ich auch noch einbauen. Danke.

Aber es geht nicht es kommt immer noch ein Fehler.

Ich habe hier noch eine kleine Beschreibung des pivolume

Delphi-Quellcode:

int * piVolume    

Location in which to store attenuation value obtained ranging in value from MIN_VOLUME=288 through MAX_VOLUME=0 where each of the 288 steps represents -0.5dB attenuation.

Kann mir das mal einer erklären das versteh ich auch ned so ganz ? pls.

MfG

Robert Marquardt 23. Mär 2007 18:01

Re: Dll Aufruf übersetzen
 
Kannst du mal lesen was ich geschrieben habe? "var piVolume : Integer" nicht "var piVolume : PInteger".
Die Funktionen sind moeglicherweise cdecl und nicht stdcall.

Christian Seehase 23. Mär 2007 18:04

Re: Dll Aufruf übersetzen
 
Moin ebber,

was für ein Fehler kommt denn?

Nach der Deklaration, müsste man es so aufrufen können:

Delphi-Quellcode:
var
  piMyVolume : PInteger;
  iMyVolume : Integer;
 
begin
  // 1. Variante
  dpGetDevMonitorAtten(0,0,@piMyVolume);
  // 2. Variante
  dpGetDevMonitorAtten(0,0,iMyVolume);
end;
ob das so Sinn macht, sei jetzt mal dahingestellt ;-)

[EDIT]
iMyVolume muss natürlich ein integer sein :wall:
[/EDIT]

ebber 23. Mär 2007 18:45

Re: Dll Aufruf übersetzen
 
Danke. Das Problem hat sich jetzt gelöst.

Falls einer noch nichts zu tun hat. Was ist ein PInteger und was ist der Unterschied bei cdecl?

MfG

Luckie 23. Mär 2007 20:59

Re: Dll Aufruf übersetzen
 
Aufrufkonventionen: http://www.michael-puff.de/Developer...entionen.shtml

Christian Seehase 24. Mär 2007 02:00

Re: Dll Aufruf übersetzen
 
Moin Ebber,

Zitat:

Zitat von ebber
Was ist ein PInteger

Die Adresse einer Speicherstelle, die als Integer-Wert zur behandeln sein soll.

Zacherl 24. Mär 2007 15:07

Re: Dll Aufruf übersetzen
 
Oder etwas einfacher formuliert ein Pointer auf einen Integer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 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