Bagikan melalui


Memanggil Pustaka DbgHelp

Meskipun DbgHelp.dll disertakan dengan semua versi Windows, pengguna harus mempertimbangkan untuk menggunakan salah satu versi DLL yang lebih baru seperti yang tersedia dalam paket Alat Debugging Untuk Windows. Untuk detail tentang distribusi DbgHelp, lihat versi DbgHelp.

Saat menggunakan DbgHelp, strategi terbaik adalah menginstal salinan pustaka dari paket Debugging Tools For Windows di direktori aplikasi yang secara logis berdekatan dengan perangkat lunak yang memanggilnya. Jika Server Simbol dan Server Sumber juga diperlukan, maka SymSrv.dll dan SrcSrv.dll harus diinstal di direktori yang sama dengan DbgHelp.dll, karena DbgHelp hanya akan memanggil DLL ini jika mereka berbagi direktori yang sama dengannya. (Perhatikan bahwa DbgHelp tidak akan memanggil kedua DLL ini dari jalur pencarian standar.) Ini membantu mencegah penggunaan DLL yang tidak cocok; demikian juga, ini juga meningkatkan keamanan secara keseluruhan.

Kode berikut diekstrak dari sumber DbgHelp. Ini menunjukkan bagaimana DbgHelp hanya memuat versi SymSrv.dll dan SrcSrv.dll dari direktori yang sama dengan tempat DbgHelp.dll berada.

HINSTANCE ghinst;

// For calculating the size of arrays for safe string functions.

#ifndef cch
 #define ccht(Array, EltType) (sizeof(Array) / sizeof(EltType))
 #define cch(Array) ccht(Array, (Array)[0])
#endif

//
// LoadLibrary() a DLL, using the same directory as dbghelp.dll.
//

HMODULE 
LoadDLL(
    __in PCWSTR filename
    )
{
    WCHAR drive[10] = L"";
    WCHAR dir[MAX_PATH + 1] = L"";
    WCHAR file[MAX_PATH + 1] = L"";
    WCHAR ext[MAX_PATH + 1] = L"";
    WCHAR path[MAX_PATH + 1] = L"";
    HMODULE hm;
    
    // Chop up 'filename' into its elements.
    
    _wsplitpath_s(filename, drive, cch(drive), dir, cch(dir), file, cch(file), ext, cch(ext));

    // If 'filename' contains no path information, then get the path to our module and 
    // use it to create a fully qualified path to the module we are loading.  Then load it.
    
    if (!*drive && !*dir) 
    {
        // ghinst is the HINSTANCE of this module, initialized in DllMain or WinMain
         
        if (GetModuleFileNameW(ghinst, path, MAX_PATH)) 
        {
            _wsplitpath_s(path, drive, cch(drive), dir, cch(dir), NULL, 0, NULL, 0);
            if (*drive || *dir) 
            {
                swprintf_s(path, cch(path), L"%s%s%s%s", drive, dir, file, ext);
                hm = LoadLibrary(path);
                if (hm)
                    return hm;
            }
        }
    }
    else
    {
        // If we wanted to, we could have LoadDLL also support directories being specified
        // in 'filename'.  We could pass the path here.  The result is if no path is specified,
        // the module path is used as above, otherwise the path in 'filename' is specified.
        // But the standard search logic of LoadLibrary is still avoided.
        
        /*
        hm = LoadLibrary(path);
        if (hm)
            return hm;
        */
    }
    
    return 0;
}

Setelah memuat kedua DLL ini, DbgHelp memanggil GetProcAddress untuk mendapatkan fungsi yang dibutuhkan dari mereka.

Biasanya, kode yang memanggil DbgHelp.dll memastikan bahwa versi yang benar dimuat dengan menginstal DbgHelp.dll di direktori yang sama dengan aplikasi yang memulai proses saat ini. Jika kode panggilan berada di DLL dan tidak memiliki akses ke atau pengetahuan tentang lokasi proses awal, maka DbgHelp.dll harus diinstal bersama DLL panggilan dan kode yang mirip dengan LoadDLL DbgHelp harus digunakan.

Versi DbgHelp

LoadLibrary

GetProcAddress

GetModuleFileName