次の方法で共有


IDiaImageData

モジュールまたはイメージの基本場所とメモリ オフセットの詳細を公開します。

構文

IDiaImageData : IUnknown

Vtable 順序のメソッド

次の表に、IDiaImageData のメソッドを示します。

メソッド 説明
IDiaImageData::get_relativeVirtualAddress アプリケーションを基準とする、モジュールの仮想メモリ内の場所を取得します。
IDiaImageData::get_virtualAddress イメージの仮想メモリ内の場所を取得します。
IDiaImageData::get_imageBase イメージのベースとなるメモリの場所を取得します。

解説

一部のデバッグ ストリーム (XDATA、PDATA) には、イメージに保存されているデータのコピーが含まれています。 これらのストリーム データ オブジェクトに対して、IDiaImageData インターフェイスのクエリを実行できます。 詳細については、このトピックの「呼び出し元に関する注意事項」を参照してください。

呼び出し元に関する注意事項

このインターフェイスを取得するには、IDiaEnumDebugStreamData オブジェクトに対して QueryInterface を呼び出します。 すべてのデバッグ ストリームで IDiaImageData インターフェイスがサポートされているわけではないことに注意してください。 たとえば、現時点で IDiaImageData インターフェイスをサポートしているのは、XDATA および PDATA ストリームだけです。

この例では、すべてのデバッグ ストリームを対象に、IDiaImageData インターフェイスをサポートするストリームを検索します。 そのようなストリームが見つかった場合は、そのストリームに関する情報が表示されます。

void ShowImageData(IDiaSession *pSession)
{
    if (pSession != NULL)
    {
        CComPtr<IDiaEnumDebugStreams> pStreamsList;
        HRESULT hr;

        hr = pSession->getEnumDebugStreams(&pStreamsList);
        if (SUCCEEDED(hr))
        {
            LONG numStreams = 0;
            hr = pStreamsList->get_Count(&numStreams);
            if (SUCCEEDED(hr))
            {
                ULONG fetched = 0;
                for (LONG i = 0; i < numStreams; i++)
                {
                    CComPtr<IDiaEnumDebugStreamData> pStream;
                    hr = pStreamsList->Next(1,&pStream,&fetched);
                    if (fetched == 1)
                    {
                        CComPtr<IDiaImageData> pImageData;
                        hr = pStream->QueryInterface(__uuidof(IDiaImageData),
                                                     (void **)&pImageData);
                        if (SUCCEEDED(hr))
                        {
                            CComBSTR name;
                            hr = pStream->get_name(&name);
                            if (SUCCEEDED(hr))
                            {
                                wprintf(L"Stream %s:\n",(BSTR)name);
                            }
                            else
                            {
                                wprintf(L"Failed to get name of stream\n");
                            }

                            ULONGLONG imageBase = 0;
                            if (pImageData->get_imageBase(&imageBase) == S_OK)
                            {
                                wprintf(L"  image base = 0x%0I64x\n",imageBase);
                            }

                            DWORD relVA = 0;
                            if (pImageData->get_relativeVirtualAddress(&relVA) == S_OK)
                            {
                                wprintf(L"  relative virtual address = 0x%08lx\n",relVA);
                            }

                            ULONGLONG va = 0;
                            if (pImageData->get_virtualAddress(&va) == S_OK)
                            {
                                wprintf(L"  virtual address = 0x%0I64x\n", va);
                            }
                        }
                    }
                }
            }
        }
    }
}

要件

ヘッダー: Dia2.h

ライブラリ: diaguids.lib

DLL: msdia80.dll

関連項目