2012-01-05 29 views
2

に私はWindowsコンソールアプリケーション(C++)にバイナリファイルを埋め込むしようとしているLOCKRESOURCEは()のポインタを返しますが、未知の構造体

のWindows 7上のVisual Studio 2003で働いています。 私はリソーススクリプト(.RCファイル)次の行に追加:

SampleFile RCDATA "c:\\sample.zip" 

と、ファイルにアクセスするには、次のコードを追加しました:今

HRSRC hResource = FindResource(NULL, (LPCSTR)"SampleFile", RT_RCDATA); 
LPVOID l = LockResource(hResource); 

を、hResourceは有効なハンドルとLOCKRESOURCEですも成功しますが、ポインタlは構造体(おそらくヘッダ)を指しています。次に、埋め込みようとしていたzipファイルの実際のデータが続きます。 上記のヘッダーの2番目のDWORDがファイルのサイズであり、リソースの名前( "SampleFile")もヘッダーに表示されますが、ヘッダーの説明を見つけることはできませんでした少なくともヘッダーサイズ。

+7

FindResource()、** LoadResource()**、次にLockResource()を実行する必要があります。 – Luke

+1

これを拡張するために、私は 'LockResource()'はWin32上ではほとんど何もしていません。 [歴史的な理由から](http://blogs.msdn.com/b/oldnewthing/archive/2004/02/02/66159.aspx)、これは Deanna

答えて

0

リソースのサイズを取得するApi関数があります。SizeofResource。ファイルの先頭に
ポインタポイントは、(あなたのケース「はC:\ sample.zip)リソースとして追加。 したい場合は、解凍ライブラリにそのポインタを渡すか、単にディスクに書き込むことができます

+0

私はSizeOfResource関数を認識しています。しかし、私の質問によると、LockResourceによって返されるポインタは、ファイル内のデータを指していません。それはいくつかの構造体を指しています。それは、どんなファイルタイプでも、.zipファイルだけでなく、そのようなものです。 – user1132301

+0

質問を読んでください。内部ヘッダーはありません。 ResHackerでファイルを開き、必要なリソースがあることを確認してください。次に、MAKEINTRESOURCEを使用することを確認します。名前((LPCSTR) "SampleFile")は実行可能ファイルに格納されません。 'FindResource'がどのように成功したかは分かりません。 – cprogrammer

3

。ルークが言ったように、あなたが途中でLoadResource()コールを逃している。

FindResource()は、本質的に、あなたにポインタを与える/リソースヘッダに取り扱い、LoadResource()は、そのヘッダーを読み、あなたに(Win32では)データを指していること値を与えます以前はメモリ内で移動できるHGlobalであったので、この場所をロックしてLockResource()を使用してポインタを取得します。

ただし、Win32では使用方法は同じです。 MSDN

から

はにfindResourceまたはFindResourceEx関数によって返されたハンドルを使用してリソースをロックしようとしないでください。このようなハンドルはランダムなデータを指し示します。

リソースヘッダーは、架空のRESOURCEHEADER構造としてMSDNに記述されています。

この応答は、主に助けを16-bit resource management

0

感謝のレイモンド陳氏の記事から取られています。 実際には私のコードにLoadResourceがありましたが、これはサイトへのコピー貼り付けで失われました。 しかし、それは私のコードの問題に関連しています。 コードは次のようになります。(今回の擬似コード) ハンドルhFindHandle = FindResource(...); LoadResource(hFindHandleおよびモジュールハンドル); 、次に LPVOID l = LockResource(hFindHandle);

私はLoadResourceからの戻り値を使用しませんでしたが、FindResourceからの戻り値を使用していました。したがって、私はLoadResourceを呼び出しましたが、LockResourceから正しいポインタを取得しませんでした。

+0

正確には、編集されたサブセット/スニペットではなく正確なコードをコピー&ペーストする必要があります。 – Deanna

関連する問題