AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wer kann mir diese C Funktion uebersetzen?
Thema durchsuchen
Ansicht
Themen-Optionen

Wer kann mir diese C Funktion uebersetzen?

Ein Thema von mika · begonnen am 29. Jan 2006 · letzter Beitrag vom 6. Feb 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#1

Wer kann mir diese C Funktion uebersetzen?

  Alt 29. Jan 2006, 20:15
Hallo Delphi-Praxis!

Ich hab ein Problem nämlich das ich eine DLL schreiben muss für eine Anwendung. Jetzt
habe ich allerdings Probleme beim auslesen der Parameter, soweit ich das mitbekommen
habe wird als einziger Parameter ein Pointer auf eine mir bekannte Struktur übergeben.

Als Beispiel habe ich in der Hilfe der Anwendung diesen Beispiel C Code gefunden der
erklärt wie das ganze vonstatten gehen soll. Allerdings sind meine C Kenntnisse arg
begrenzt ebenso wie mein Wissen über Pointer unter Delphi

Könnte mir jemand aus dieser C Methode mal eine Delphi Methode schreiben? Dann wär ich
schon n ganzes Stück weiter!

Code:
struct TEST_SUB_PARAMS  // This structure represents the parameters passed to
{                        // the Log_B_of_X function.
   double  base;
   double  x;
   HWND    hwnd;   // Note: the handle to the frame window is always tacked on
                     // as a final parameter (even if there are no others).
};

extern "C" // This makes this a C function rather than a C++ function!
{
   // Borland & Microsoft add a leading underscore to a 'C' name for export!
   // All ProModel XSUB calls must go to a function with this signature.
   double _export Log_B_of_X(void *p)
   {
      MessageBox(GetTopWindow(hWndFrame),"Executing Log_B_of_X function.","XSUB",MB_OK);

      // Parameters come in in a structure pointed to by p;
      TEST_SUB_PARAMS *params;
      params = (TEST_SUB_PARAMS*)p;
      hWndFrame = params->hwnd;
      return log(params->x) / log(params->base);
   }
}
Danke schonmal an euch

[edit=alcaeus]SQL- in C-Tags umgewandelt. Mfg, alcaeus[/edit]
[edit=mika]Wir haben C Format BB-Codes? Wusst ich gar nicht [/edit]
:: don't Panic ::
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Wer kann mir diese C Funktion uebersetzen?

  Alt 30. Jan 2006, 09:29
Ich habe C zur Seite gelegt, als TP auf den Markt kam, aber das hier könnte eine Ausgangsbasis für dich sein:

Delphi-Quellcode:
library Test;

uses
  Windows,
  Math,
  SysUtils,
  Classes;

{$R *.res}

type
  PTEST_SUB_PARAMS = ^TTEST_SUB_PARAMS;
  TTEST_SUB_PARAMS = record
    base: double;
    x: double;
    h: HWND;
  end;

function Log_B_of_X(var p): Double; cdecl;
var
  params: PTEST_SUB_PARAMS;
begin
  params := @p;
  MessageBox(GetTopWindow(params.h), 'Executing Log_B_of_X function.' , 'XSUB',MB_OK);
  Result := ln(params.x) / ln(params.base);
end;

exports
  Log_B_of_X name '_Log_B_of_X'; // prüfen

end.
Grüße vom marabu
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#3

Re: Wer kann mir diese C Funktion uebersetzen?

  Alt 30. Jan 2006, 09:52
Marabu hat das ja soweit richtig gemacht, aber er hat die Zuweisung an hWndFrame unterschlagen, da diese Variable in der C Source nicht deklariert ist.
Das duerfte Nebeneffekte verursachen. Alles in allem ist die C Funktion ziemlich schlecht implementiert.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Wer kann mir diese C Funktion uebersetzen?

  Alt 30. Jan 2006, 10:27
Hallo Robert,

ich hatte mehrfach hin und her überlegt, wozu die globale Variable hWndFrame gut sein könnte, aber angesichts der gegebenen Funktion und der Verwendung der Variable darin konnte ich keinen Sinn entdecken. Erkennst du da etwas?

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#5

Re: Wer kann mir diese C Funktion uebersetzen?

  Alt 30. Jan 2006, 12:40
Das ist offensichtlich eine globale Variable anderswo.
Deshalb bin ich ja der Meinung die C-Funktion taugt nichts. Die C-Implementation ist mit Nebeneffekten gesegnet und merkwuerdig im Design.
Es waere besser alles von vorne zu implementieren.
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#6

Re: Wer kann mir diese C Funktion uebersetzen?

  Alt 30. Jan 2006, 15:12
Hallo und erstmal danke für die Antworten,

das mit der Messagebox ist gar nicht so wichtig, ich habe das halt nur nicht hinbekommen die
Parameter zu ermitteln die das aufrufende Programm mir übergeben will.

Delphi-Quellcode:
type
  PTEST_SUB_PARAMS = ^TTEST_SUB_PARAMS;
  TTEST_SUB_PARAMS = record
    base: double;
    x: double;
    h: HWND;
  end;

function Log_B_of_X(var p): Double; cdecl;
var
  params: PTEST_SUB_PARAMS;
begin
  params := @p;
  MessageBox(GetTopWindow(params.h), 'Executing Log_B_of_X function.' , 'XSUB',MB_OK);
  Result := ln(params.x) / ln(params.base);
end;
So hatte ich das auch gemacht allerdings glaube ich das ich vor dem
  params := @ params; noch ein
  new(params); gemacht hab...

Leider kann ich das jetzt nicht mehr testen da ich das aufrufende Programm nicht hier habe
Allerdings schien ich ja schon auf der richtigen Spur zu sein...

Sobald ich wieder testen kann schreib ich euch ob ich das inzwischen hinbekommen habe!


Danke für eure Hilfe, Michael.

<edit>
Jetzt sehe ich grade das du als parameter gar keinen typ angegeben hast in der funktion und ausserdem
nicht stdcall verwendest sondern cdecl! Ist das sehr wichtig?
    function Log_B_of_X(var p): Double; cdecl; Hab grade noch mal nachgeschaut, meine Funktion so sah so aus:
Delphi-Quellcode:
    function Log_B_of_X(p: pointer): Double; stdcall;
    var
      params: PTEST_SUB_PARAMS;
    begin
      params := @p;
      // Nur als Beispiel jetzt:
      blabla := params^.base;
    end;
Da werden die Unterschiede dann doch schon größer oder was sagt ihr?

</edit>
:: don't Panic ::
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: Wer kann mir diese C Funktion uebersetzen?

  Alt 30. Jan 2006, 15:34
Delphi-Quellcode:
function Log_B_of_X(var params: TTEST_SUB_PARAMS): Double; cdecl;
begin
  MessageBox(GetTopWindow(params.h), 'Executing Log_B_of_X function.' , 'XSUB',MB_OK);
  Result := ln(params.x) / ln(params.base);
end;
Dashier reicht auch schon aus. Was will man der Funktion denn sonst übergeben.
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#8

Re: Wer kann mir diese C Funktion uebersetzen?

  Alt 30. Jan 2006, 15:42
Ich bin mir nicht sicher da ich das Programm das meine DLL aufruft nicht sonderlich gut kenne und
ich halt nur weiss das es, damit man verschiedene Arten von Methoden aus DLLs aufrufen kann, nur
einen Pointer übergibt.

Die Methode die ich hier als Beispiel genommen habe gibt ja noch was zurück, das machen meine
ganzen Methoden nicht (jedenfalls keine Berechnung). Ich bekomme Daten übergeben die ich in eine
Datenbank speichern soll und je nachdem ob bei mri alles geklappt hat oder nicht gebe ich 0 oder 1
zurück.

[edit]
Ist zwischen stdcall und cdecl ein großer Unterschied?
[/edit]
:: don't Panic ::
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

Re: Wer kann mir diese C Funktion uebersetzen?

  Alt 30. Jan 2006, 15:55
Zitat von mika:
Ich bin mir nicht sicher da ich das Programm das meine DLL aufruft nicht sonderlich gut kenne und ich halt nur weiss das es, damit man verschiedene Arten von Methoden aus DLLs aufrufen kann, nur einen Pointer übergibt.
Das kann deiner DLL wurst sein. Wenn du sowieso einen Typecast in deinen TEST_SUB_PARAMS Typ machst, kannst du auch gleich einen Zeiger (var) auf TTEST_SUB_PARAMS als Parameter einbauen. Das ist weniger Tipparbeit und ein MOV-Befehl weniger. Der aufrufende Code hat seine eigene Deklaration, die dort vielleicht einen Zeiger erwartet, aber du akzeptierst ja auch einen Zeiger.

Zitat:
Ist zwischen stdcall und cdecl ein großer Unterschied?
Ja.
StdCall übergibt die Parameter von links nach rechts und die aufgerufene Funktion löscht sie wieder vom Stack.

Cdecl übergibt die Parameter von rechts nach links und der Aufrufer löscht sie wieder vom Stack.
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#10

Re: Wer kann mir diese C Funktion uebersetzen?

  Alt 30. Jan 2006, 16:00
Alles klar,

hab grad noch einige andere Threads über DLL Aufrufkonventionen über mehrere Sprachen gelesen in denen du
auch geantwortet hast und du scheinst dich da ja auszukennen

Ich probier das mal aus, blöd ist halt nur das ich das ganze grad nicht testen kann
Wenn ich am Wochenende die Möglichkeut bekomme das auszuprobieren dann schreib
ich euch sofort wie sich das ganze ausgewirkt hat!


Danke für eure Hilfe!
:: don't Panic ::
  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 12:12 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