AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Procedure Safecall > function?

Ein Thema von EWeiss · begonnen am 30. Jul 2012 · letzter Beitrag vom 31. Jul 2012
 
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Procedure Safecall > function?

  Alt 31. Jul 2012, 09:56
Ich verstehe zwar deinen Code nicht, aber vielleicht hilft dir folgende Information:
Safecall ist dasselbe wie stdcall nur mit HResult als Rückgabewert.

Es passiert in etwa folgendes:
Delphi-Quellcode:
//folgende Routine:
procedure doX; safecall;
begin
...
end

//ist identisch mit
function doX:HResult; stdcall;
begin
  try
    ...
    result:=s_ok;
  except
    result:=irgendeinfehler;
  end;
end;
bzw, wenn man schon eine Funktion hat:
Delphi-Quellcode:
//aus
function getX:Integer;safecall;
//wird
function getX(out x:Integer):HResult;stdcall;
//der Rückgabewert kommt an das Ende der Parameterliste

Und es passiert nicht nur das, auch Delphi macht beim Aufrufen solcher Funktionen noch ein bisschen Hokuspokus. Es sortiert nicht nur die Parameter und Rückgabewerte um, sondern es ruft auch automatisch nach jeder safecall-Routine eine Funktion auf, die den Rückgabewert - also HResult - testet und ggf. wieder eine Exception wirft.

Damit schafft man es in dem ganzen COM-Wirrwarr automatisch aus eine Exception einen Rückgabewert und daraus wieder eine Exception zu basteln ohne dein Zutun. Denn Exceptions (also Objekte) können nur schwer über DLL-Grenzen hinaus verschoben werden. Es ist ja zwangsläufig so, dass die Exceptions von der DLL(oder COM-Klasse) erzeugt werden und dann hast du sie im Hauptprogramm und kannst sie nicht freigeben. Deswegen dieser WorkAround.

So, ich hoffe, du weißt jetzt warum es safecall gibt (falls das nicht eh schon der Fall war) und kannst daraus dein weiteres Vorgehen ableiten.


Edit: Konnte man nicht beim automatischen TLB-Import einstellen, ob man safecall in stdcall umwandeln will?

Edit2: In Delphi 7 habe ich keine Einstelloptionen gefunden aber auf der Kommandozeile funktioniert es:
Code:
tlibimp -P+ -Ps- <typelib>
-P+ sagt dass er eine Pascall-Datei erzeugen soll
und -Ps- sagt keine safecall-Routinen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.

Geändert von sirius (31. Jul 2012 um 10:17 Uhr)
  Mit Zitat antworten Zitat
 


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 00:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz