AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Übersetzung C++ -> Pascal, Callback, Zugriffsverletzung
Thema durchsuchen
Ansicht
Themen-Optionen

Übersetzung C++ -> Pascal, Callback, Zugriffsverletzung

Ein Thema von _BlackDragon_ · begonnen am 28. Mär 2009 · letzter Beitrag vom 28. Mär 2009
Antwort Antwort
_BlackDragon_

Registriert seit: 4. Dez 2007
Ort: Eschweiler
64 Beiträge
 
#1

Übersetzung C++ -> Pascal, Callback, Zugriffsverletzung

  Alt 28. Mär 2009, 15:07
Hi Leute,

hab ein Problem bei der Übersetzung einer API von C++ nach Pascal/Delphi.

Erstmal die Deklaration der Original Callback Routine:
Code:
typedef void*( * ADL_MAIN_MALLOC_CALLBACK)(int)
Zitat:
Memory Allocation Call back.
Die Callback-Routine in Delphi als Typ deklariert:
type TADL_MAIN_MALLOC_CALLBACK = function(iSize: Integer): Pointer; stdcall;
So weit denke ich, das es richtig übersetzt ist.

Jetzt kommt die Routine aus der API, welche diese Callback-Routine nutzen soll.

Code:
int ADL_Main_Control_Create (ADL_MAIN_MALLOC_CALLBACK callback, int iEnumConnectedAdapters)
Zitat:
Function to initialize the ADL interface. This function should be called first.

This function initializes the ADL library. It also initializes global pointers and, at the same time, calls the ADL_Main_Control_Refresh function.

Supported Platforms:
Linux and Windows(XP and Vista); 32bit and 64bit
Parameters:
[in] callback,: The memory allocation function for memory buffer allocation. This must be provided by the user. ...
Und meine Übersetzung:

Delphi-Quellcode:
type
  TADL_Main_Control_Create = function(CallBack: TADL_MAIN_MALLOC_CALLBACK;
                                      iEnumConnectedAdapters: Integer): Integer; stdcall;

Laut der Doku und den Beispielen, sieht die Implementierung der Callback-Routine
in C++ so aus:

Code:
void* __stdcall ADL_Main_Memory_Alloc ( int iSize )
{
    void* lpBuffer = malloc ( iSize );
    return lpBuffer;
}
Meine Implementierung:

Delphi-Quellcode:
function ADL_Main_Memory_Alloc(iSize: Integer): Pointer; stdcall;
begin
  Result := AllocMem(iSize);
end;

Des weiteren geht aus den Beispielen hervor, das die Initialisierung und der Aufruf wie folgt von statten gehen soll:

Code:
...
ADL_Main_Control_Create = (ADL_MAIN_CONTROL_CREATE)GetProcAddress(hDLL,"ADL_Main_Control_Create");
        if ( NULL != ADL_Main_Control_Create)
            ADL_Err = ADL_Main_Control_Create (ADL_Main_Memory_Alloc, 0);
...

In Delphi mache ich das so:

Delphi-Quellcode:
...
var
  ADL_Main_Control_Create: TADL_Main_Control_Create = nil;
...

function ADL_Initialize: Integer;
...

  @ADL_Main_Control_Create := GetProcAddress(hLib, 'ADL_Main_Control_Create');

  if (ADL_Main_Control_Create <> nil) then
  begin
    Result := ADL_Main_Control_Create(@ADL_Main_Memory_Alloc,0); // als Result wird 0 (= OK) zurück
                                                                 // gegeben, was laut Doku aussagt
                                                                 // das der Aufruf klappt.
  end;
...
end;

Der Aufruf klappt und die anderen Funktions-Variablen werden auch zugewiesen.
Aber beim Verlassen der Routine 'ADL_Initialize', wird nicht in den Programmteil, der den Aufruf
tätigt zurückgegehrt, sondern folgende Exception geworfen.

Zitat:
---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
Im Projekt M:\Projekte\ADL_Test\debug\ADL_Test.exe sind zu viele auseinanderfolgende Exceptions aufgetreten: ''access violation at 0x00000000: read of address 0x00000000''. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.


Leider bin ich bisher noch nicht dahinter gekommen warum, und möchte nun wissen ob
die Übersetzung wenigstens korrekt ist und ich Fehler darin ausschließen kann.

Vielen Dank schon mal für eure Hilfe.

Gruss

BlackDragon
  Mit Zitat antworten Zitat
Apollonius

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

Re: Übersetzung C++ -> Pascal, Callback, Zugriffsverletzu

  Alt 28. Mär 2009, 15:12
Anscheinend ist die Aufrufkonvention cdecl und nicht stdcall.
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
_BlackDragon_

Registriert seit: 4. Dez 2007
Ort: Eschweiler
64 Beiträge
 
#3

Re: Übersetzung C++ -> Pascal, Callback, Zugriffsverletzu

  Alt 28. Mär 2009, 20:09
Hi,

kann es jetzt leider nicht testen, aber ich hatte mich beim kopieren vertan.

Die richtige Implementation laut Original Header lautet:

Code:
#if defined (LINUX)
#define __stdcall
#endif /* (LINUX) */

/// Memory Allocation Call back
typedef void* ( __stdcall *ADL_MAIN_MALLOC_CALLBACK )( int );
Deshalb ging ich davon aus, das der Aufruf stdcall sein müsste. Für die anderen Routinen
habe ich leider nur die Dokumentation. Dort steht aber nichts über die Aufrufkonvention
drin.

@Apollonius:
Prinzipiell meinst du aber, dass die Übersetzung so korrekt ist, oder?

Gruss

BlackDragon
  Mit Zitat antworten Zitat
Apollonius

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

Re: Übersetzung C++ -> Pascal, Callback, Zugriffsverletzu

  Alt 28. Mär 2009, 21:57
Abgesehen von der Aufrufkonvention müsste das so stimmen. Bezüglich der Aufrufkonvention müsstest du schauen, ob __stdcall irgendwo noch definiert ist (defined(LINUX) müsste hier false ergeben, also ist das keine Definition). Falls es mit cdecl nicht klappt, solltest du dich mal in die unendlichen Weiten der CPU-Ansicht vorwagen. Das Problem sieht so aus, also hättest du dir den Stack zerschossen, und da ist eine falsche Aufrufkonvention sehr wahrscheinlich.
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
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#5

Re: Übersetzung C++ -> Pascal, Callback, Zugriffsverletzu

  Alt 28. Mär 2009, 22:58
Das ganze sieht für mich auch so aus, als sollte unter Linux stdcall und ansonsten cdecl verwendet werden (eigentlich eine untypische Sache).
Man kann einen Barbier definieren als einen, der alle diejenigen rasiert, und nur diejenigen, die sich nicht selbst rasieren.
Rasiert sich der Barbier?
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:54 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