2011-01-14 56 views
0

異なるアプリケーション間でメモリを共有するDLLを作成しています。CreateFileMapping()name

#define NAME_SIZE 4 
HANDLE hSharedFile; 

create(char[NAME_SIZE] name) 
{ 
    hSharedFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, (LPCSTR)name); 
    (...) //Other stuff that maps the view of the file etc. 
} 

それは動作しません:

共有メモリを作成するコードは次のようになります。私はそれが動作する文字列でnameを交換する場合は:

SharedFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, (LPCSTR)"MY_TEST_NAME"); 

は、どのように私は、これはchar型の配列で動作するように入手できますか?

私はいつも文字列を使用するjavaバックグラウンドを持っていますが、LPCSTRは何ですか?そして、これは私のMS VC++プロジェクトがUnicodeを使用しているかどうかに関係またはMulti-Byte文字を使用すると、ドキュメントを見れば、あなたはほとんどのWin32関数はTCHARの文字列を表しLPCTSTRを取ることがわかります

+0

のように末尾に「\ 0」を追加しなければなりませんか?失敗したときに 'CreateFileMapping'の戻り値とエラーコード(' GetLastError'で取得できます)は何ですか? –

+0

関数を作成するパラメータとして何を渡していますか? – Elalfer

+0

私は{'T'、 'E'、 'S'、 'T'}を渡していますが、それは失敗しませんが、後で別のアプリケーションで共有メモリ空間を開くことができません。 – sigvardsen

答えて

2

NAME_SIZEの値を大きくする必要があるとします。

配列は、行の最後を示す末尾に\ 0文字を保持するために、少なくとも文字数+ 1でなければならないことを忘れないでください。

LPCSTRは、8ビットのWindows(ANSI)文字の定数NULLで終わる文字列へのポインタで、次のように定義されます。たとえば

LPCSTR defined as typedef __nullterminated CONST CHAR *LPCSTR; 

あなたが"Hello world"定数を持っており、それが11の文字、それを持っている場合でも、メモリ内の12バイトを占有します。

あなたはcreate` `に渡しているあなたは、配列のように文字列定数を渡している場合は、char型の配列(` name`の)の値であり、どのような{'T','E','S','T', '\0'}

+0

ありがとう、私はサイズを増やしましたが、私には最後の文字として '\ 0'が必要であることは論理的ではないようです。 – sigvardsen

+0

Cの文字列の詳細については、http://en.wikipedia.org/wiki/C_stringを参照してください。 – Elalfer

+0

あなたは、 Javaで。これがあなたのためにちょっと混乱する理由です。JavaはVM内でヌル終了文字列を使用し、Java文字列クラスにラップします。 – Elalfer

1

を設定しません。 Unicode(デフォルト)またはANSIのどちらを使用するかによって、TCHARwchar_tまたはcharに展開されます。また、LPCWSTRおよびLPCSTRは、それぞれUnicodeおよびANSI文字列を明示的に表します。

ほとんどの場合、明示的にcharの配列/ポインタではなく、文字列が必要な場所であれば、LPCTSTRを使用してください。また、TEXT("...")マクロを使用して、"..."の代わりに正しい種類の文字列リテラルを作成します。

どちらの例もLPCSTRしか使用していないため、あなたのケースでは、これは問題の原因とは思われません。 NAME_SIZEを4と定義した場合、配列が小さすぎて必要な文字列を保持できない可能性がありますか?

関連する問題