1

作業する必要のあるアンマネージC/C ++ dllのラッパーをC#で作成しようとしています。その過程で、私は非常に古いC++スキルの錆を追い払おうとしています。.hファイルに以下のコードがあります。

png_demand_record_create(const char *name, const char* loc, int date, int quantity);

最初の2つのパラメーターはsringsで、次の2つは整数です。cには、実際には文字列ではなく、文字の配列などがあることを覚えているようです。*名前は文字配列へのポインタではありませんか?2番目のパラメーターに*がcharの「r」の後にあり、locの「l」の前にないのはなぜですか?これら2つのパラメーターの違いは何ですか?作成者の入力だけで可能であり、実際にはそうではありません。案件?

また、ツール(Pinvoker)を使用して、アンマネージdll(.hファイルとコンパイル済みdllのみ)を呼び出すためのC#ラッパーを作成しています。ツールは私に以下を与えます:

[DllImport(@"C:\Some.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
    public extern static png_demand_record_t png_demand_record_create([MarshalAs UnmanagedType.LPStr)] string name,
[MarshalAs(UnmanagedType.LPStr)] string loc, 
int date,
int quantity);

.hファイルでは「name」と「loc」が異なっていても、ツールが「name」と「loc」を同じように定義しているように見えます。これについて心配する必要がありますか?

トンありがとう!

4

3 に答える 3

1

間に違いはありません:

const char* loc

const char *loc

*一部のプログラマーは、タイプの一部として考えるために前者を好みます。一部のプログラマーは後者を好みます。これは、*が実際にはこの宣言の1つの変数にのみ適用されるためです。

char *foo,bar;

fooこの場合はポインタのみです。barシンプルcharで、それ以上のものではありません。(それが私が好む理由ですchar *foo。)

この場合、これらは同一であるため、Pinvokerツールで同じように処理する必要があります。ただし、一方が入力パラメーターで、もう一方が出力パラメーターである場合を除きます。ラップしているAPIを理解して、どのAPIが入力され、どのAPIが出力されるかを確認してください。双方向のAPIがある場合はそれを確認してください。

于 2012-08-01T20:56:29.730 に答える
1

最初の質問に答えるには:それらはまったく同じです。char* strと同じ、char *strchar*str同じchar * str、などと同じです。

C#については、あまり役に立たないのではないかと思います。

興味がある場合、またはそれが関連している場合は、ここにc-stringsに関するウィキペディアのページがあります(これはあなたがここで扱っているものです)。

于 2012-08-01T20:56:32.863 に答える
1

1)周りの空白*は実際には重要ではなく、両方のパラメータータイプは同じです。
2)Pinvokerは、次のようにパラメーターをマーシャルします。

...
[MarshalAs(UnmanagedType.LPStr)] string name,
[MarshalAs(UnmanagedType.LPStr)] string loc, 
...

ですから、違いもありません。

于 2012-08-01T20:57:21.880 に答える