Udostępnij przez


IDebugComPlusSymbolProvider2::GetTypesByName

Pobiera typ o podanej nazwie.

Składnia

int GetTypesByName(
    string               pszClassName,
    enum_ NAME_MATCH     nameMatch,
    out IEnumDebugFields ppEnum
);

Parametry

pszClassName
[in] Nazwa typu.

nameMatch
[in] Wybiera typ dopasowania, na przykład uwzględnia wielkość liter. Wartość z wyliczenia NAME_MATCH .

ppEnum
[out] Moduł wyliczający zawierający typ lub typy o podanej nazwie.

Wartość zwracana

Jeśli operacja powiedzie się, zwraca wartość S_OK; w przeciwnym razie zwraca kod błędu.

Uwagi

W przypadku typów ogólnych nazwa do wyszukania wartości "List<int>" lub "List int", int> będzie miała wartość "List<". Jeśli typy tej samej nazwy pojawią się w wielu modułach, ppEnum parametr będzie zawierać wszystkie kopie. Należy użyć polecenia GetTypeInfo i odróżnić na podstawie parametru guidModule .

Przykład

W poniższym przykładzie pokazano, jak zaimplementować tę metodę dla obiektu CDebugSymbolProvider, który uwidacznia interfejs IDebugComPlusSymbolProvider2.

HRESULT CDebugSymbolProvider::GetTypesByName(
    LPCOLESTR pszClassName,
    NAME_MATCH nameMatch,
    IEnumDebugFields** ppEnum
)
{
    HRESULT hr = S_OK;
    CModIter ModIter;
    CModule* pmodule; // the iterator owns the reference
    CFieldList listField;

    ASSERT(IsValidWideStringPtr(pszClassName));
    ASSERT(IsValidWritePtr(ppEnum, IEnumDebugFields*));

    METHOD_ENTRY( CDebugSymbolProvider::GetTypesByName );

    IfFalseGo( pszClassName && ppEnum, E_INVALIDARG );
    *ppEnum = NULL;

    IfFailGo( GetModuleIter(&ModIter) );

    hr = S_FALSE;

    if ( nameMatch == nmCaseInsensitive)
    {
        while (ModIter.GetNext(&pmodule))
        {
            if (pmodule->FindTypesByNameCaseInsensitive( pszClassName,
                    &listField,
                    this ) )
            {
                hr = S_OK;
            }
        }
    }
    else
    {
        while (ModIter.GetNext(&pmodule))
        {
            if (pmodule->FindTypesByName( pszClassName,
                                          &listField,
                                          this) )
            {
                hr = S_OK;
            }
        }
    }

    // If the list is empty then no type
    IfFalseGo( listField.GetCount(), E_FAIL );

    // Create enumerator
    IfFailGo( CreateEnumerator( ppEnum, &listField ) );

Error:

    METHOD_EXIT( CDebugSymbolProvider::GetTypesByName, hr );

    return hr;
}

Zobacz też