0

わかりました... Visual Studio 2010 を使用して win32 ゲームを作成しています... グラフィックを処理するサードパーティのライブラリを使用しています。png ファイルを読み込み、ウィンドウを作成し、すべてを表示し、一般に、誰も自分で処理したくない便利な低レベルの処理を実行します。

まあ、野心的な OCD プログラマーのように、png を実行可能ファイルの中に埋め込もうとしています。そこで、ソースコードを入手し、ファイルからpngをロードする代わりに、リソースからロードするように変更を開始しました。次のコードを追加しました。

    HRSRC   hRsrc = FindResourceW(NULL, recName, recType);
    if (GetLastError() != 0)
    {
        char b[100];
        leave("Couldn't find resource", itoa(GetLastError(), b, 10));
    }
    HGLOBAL hGlob1 = LoadResource(NULL, hRsrc);
    int size = SizeofResource(NULL, hRsrc);
    HGLOBAL hGlobal = GlobalAlloc(GMEM_FIXED, size);
    LPVOID  resPtr = LockResource(hGlob1);
    LPSTREAM pStream;
    memcpy(hGlobal, resPtr, size);
    FreeResource(hGlob1);
    CreateStreamOnHGlobal(hGlobal, true, &pStream);
    buffer.resize((size_t)size);
    pStream->Read(&buffer[0], size, NULL);
    return;

recNameリソースの名前です。recTypeリソースのタイプです (これらは両方ともパラメーターとして渡されます)。leaveポップアップ メッセージを表示するカスタム関数です。bufferpng コンテンツが読み込まれるベクトルです。

このライブラリは、自分のコードが使用する静的にリンクされたライブラリにコンパイルされます。したがって、私のコードはリソースの実際の埋め込みを行います。さて、問題は、これは機能しますが、選択された少数のコンピューターでのみ機能することです。まさに私の友人の一人と同じように、私はそれを実行できます。他人のコンピュータでGetLastError()は 127 が返され、その結果、プログラムは失敗します。msdnによると、エラー 127 はThe specified procedure could not be found.... それが意味するものは何でもです。

実行可能ファイルには、mp3 や dll などの他の埋め込みファイルがすべて同じ方法で作成されており、それらは正常に動作します (また、この png は自分のコンピューターでも正常に動作します)。したがって、埋め込みの問題ではないことがわかります。 ; 私はそれをかなり理解していると思います。

では、エラー コード 127 は何を伝えようとしているのでしょうか。私のユーザーのコンピュータは関数 FindResourceW を実行する方法を知りませんか? もしそうなら、私のコードはmp3をロードするために他の場所でその関数を使用しており、それも同様に機能するため、それはまったく意味がありません(実際、pngを埋め込もうとする前に機能しました)。基本的に、この種の問題はこれまで見たことがなく、困惑しています。:|

4

1 に答える 1

1

GetLastErrorまたはを正しく使用していませんFindResourceW

FindResourceW(上にリンクされている)のドキュメントにFindResourceWは、 がモジュール ハンドル ( ) を返すこと、およびNULL を返すかどうかHRSRを確認する必要があることが明確に記載されています(強調を追加)。GetLastError

戻り値

タイプ: HRSRC

関数が成功した場合、戻り値は指定されたリソースの情報ブロックへのハンドルです。リソースへのハンドルを取得するには、このハンドルを LoadResource 関数に渡します。

関数が失敗した場合、戻り値は NULL です。拡張エラー情報を取得するには、GetLastError を呼び出します。

のドキュメントからGetLastError(再び、上記にリンクされ、再び私のものを強調します:

戻り値

戻り値は、呼び出しスレッドの最後のエラー コードです。

最後のエラー コードを設定する各関数のドキュメントの戻り値のセクションには、関数が最後のエラー コードを設定する条件が記載されています。スレッドの最終エラー コードを設定するほとんどの関数は、失敗したときにそれを設定します。ただし、一部の関数は、成功したときに最後のエラー コードも設定します。関数が最後のエラー コードを設定するように文書化されていない場合、この関数によって返される値は、設定された最新の最後のエラー コードです。一部の関数は、成功時に最後のエラー コードを 0 に設定し、他の関数は設定しません。

これは、関数が成功したときに最後のエラー コードを設定するように文書化されていない限り、関数が失敗した場合のステータスを示すためにのみエラー コードを使用する必要があることを示しています。あなたのコードは、GetLastErrorが 0 以外の場合はFindResourceW失敗したと仮定しており、その仮定は間違っています。:-) その仮定が失敗したため、コードは (誤って)ifブロックに入り、そうすべきではないときに呼び出しますleave。論理的には、ifブロック終了後のコードが実行されないことを意味します。

FindResourceWSetLastErrorは、失敗して を返す場合にのみ明確に文書化されていますNULL。あなたが想定しているFindResourceWエラー値は、エラー値を設定しているコード内の別の場所からのものです(コードは明らかに読み取っていません)。

したがって、これは正しい使用に近いでしょう(私自身はC++の人ではありません):

HRSRC   hRsrc = FindResourceW(NULL, recName, recType);
if (!hRsrc)
{
    char b[100];
    leave("Couldn't find resource", itoa(GetLastError(), b, 10));
}
于 2013-07-31T00:53:48.833 に答える