IDiaImageData

公开模块或映像的基位置和内存偏移量的详细信息。

语法

IDiaImageData : IUnknown

Vtable 顺序中的方法

下表显示了 IDiaImageData 方法。

方法 说明
IDiaImageData::get_relativeVirtualAddress 检索模块虚拟内存中相对于应用程序的位置。
IDiaImageData::get_virtualAddress 检索映像的虚拟内存中的位置。
IDiaImageData::get_imageBase 检索映像应基于的内存位置。

备注

某些调试流(XDATA、PDATA)包含同样存储在映像中的数据的副本。 可以针对 IDiaImageData 接口查询这些流数据对象。 有关详细信息,请参阅本主题中的“对调用者的说明”部分。

对调用者的说明

通过在 IDiaEnumDebugStreamData 对象上调用 QueryInterface 来获取此接口。 请注意,并非所有调试流都支持 IDiaImageData 接口。 例如,目前只有 XDATA 和 PDATA 流支持 IDiaImageData 接口。

示例

本示例在所有调试流中搜索支持 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

另请参阅