2011-01-20 13 views
5

現在、一部のCヘッダーをDelphiに翻訳しています。関数ポインタをCからDelphiに変換するための参照を見つけることができません。C関数のポインタをDelphi/Pascalに変換しますか?

typedef _JAlloc JAlloc; 
struct _JAlloc { 
    void *(*alloc) (JAlloc *allocator, size_t size); 
    void (*free) (JAlloc *allocator, void *p); 
    void *(*realloc) (JAlloc *allocator, void *p, size_t size); 
}; 
  1. これは何のDelphiの翻訳になりますか?

  2. CヘッダをDelphi(ポインタ、プリプロセッサディレクティブなど)に手動で変換するための優れたリソースはどこにありますか?

+0

が誤って(私の答えは下記を参照)のコメントとして、答えを入力します。 –

答えて

8

利用コード

type 
    PJAlloc = ^TJAlloc; 
    TJAllocAlloc = function(allocator: PJAlloc; size: integer): pointer; cdecl; 
    TJAllocFree = procedure(allocator: PJAlloc; p: pointer); cdecl; 
    TJAllocRealloc = function(allocator: PJAlloc; p: pointer; size: integer); cdecl; 
    TJAlloc = record 
    alloc: ^TJAllocAlloc; 
    free: ^TJAllocFree; 
    realloc: ^TJAllocRealloc; 
    end; 

のこの種そして、あなたのCライブラリの呼び出し規約に依存し、STDCALLするCDECLを変更します。

(おそらくより「pascalish」)代替宣言は次のようになります。

type 
    TJAllocAlloc = function(var allocator: TJAlloc; size: integer): pointer; cdecl; 
    TJAllocFree = procedure(var allocator: TJAlloc; p: pointer); cdecl; 
    TJAllocRealloc = function(var allocator: TJAlloc; p: pointer; size: integer); cdecl; 
    TJAlloc = record 
    alloc: ^TJAllocAlloc; 
    free: ^TJAllocFree; 
    realloc: ^TJAllocRealloc; 
    end; 
+0

+1非常に印象的な答え! – ComputerSaysNo

+0

ありがとうBouchez。インターネットからCからデルファイへの翻訳に関する詳しい情報はどこにありますか?私は現在Rudyのブログを使っています。 – Ramnish

+1

@Ramnish私は手元にリソースがありません。私は実験でそれを学んだ。しかし、いくつかのC API(OpenGL/GDI +/SQLiteなど)の手動変換を見てみると、いくつかのヒントがあります。 Delphiでうまくいくのは、C++ビルダー(フリーコマンドラインコンパイラを含む)でCコードをコンパイルし、その結果の.objをDelphiユニットにリンクできることです。私は_ftol/_ftoul/_lldiv/_llshrなどの低レベルのasmヒントを使用しました。http://synopse.info/fossil/finfo?name=SQLite3/SQLite3.pas –

1

博士はボブのHeadConvユーティリティは、DelphiにC宣言を変換するために使用するのは良いものであり、比較のための良い学習ツールですCソースコードを同等のパスカルソースコードに変換します。

You can find it here

+2

それは古代であり、一見決して働かなかった。 go h2p –

+1

これはODBC 3.0 APIヘッダーのために働きました。結果のコードにいくつか微調整を加えました。古くは - Cは変更されておらず、過去12〜15年で外部DLLやライブラリを呼び出すためのパスカル構文もありません。 –

関連する問題