2011-01-17 49 views
2

デバッグ用のgflagsツールを使用して、dllsオプションでフルページヒープを有効にしようとしています。これは、指定されたdllだけで、アプリケーションでフルページヒープを有効にします。gflags dllで有効にする完全なヒープが機能しません。

私はdllsオプションを使用しないとき、正常に動作します。割り当てられたメモリブロックを上書きしようとすると例外が発生することがあります。しかし、私がdllsオプションで同じ機能を有効にしようとすると、メインアプリケーションコードまたはdllコードのいずれかによって割り当てられたメモリブロックの例外が、ドキュメンテーションに従ってdllコード上になければなりません。

私はWindows XPとWindows 7の両方で試してみましたが、同じ動作をしました。私はdllの名前を誤って入力し、dllでフルページのヒープを有効にできない場合に備えて、何度もチェックしました。

無駄に両方のコマンドを試してみました:

gflags -p /enable test_dll1_app.exe /dlls test_dll1.dll 

gflags -p /enable test_dll1_app.exe /dlls test_dll1.dll /full 

これは、私がテスト用に使用していますコードです:

DLLコード:

#define TEST_DLL1_API __declspec(dllexport) 

extern "C" TEST_DLL1_API int * fntest_dll1(void) 
{ 

    int * value0 = new int [413]; 
    int * value = value0; 

    for (int i=0; i < 440; i++) 
     *value0++ = i; 

    return value; 
} 

メインアプリケーションのコード:

typedef int * (*AddFunc)(); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HINSTANCE LoadDll; 
    LoadDll = LoadLibrary(_T("test_dll1.dll")); 

    if (LoadDll) 
    { 
     AddFunc pfnctFunc; 
     pfnctFunc = (AddFunc)GetProcAddress(LoadDll, "fntest_dll1"); 
     if (pfnctFunc) 
     { 
     int * value = pfnctFunc(); 

     for (int i=0; i < 440; i++) 
      *value++ = i; 
     } 
    } 

    int * value = new int [413]; 

    for (int i=0; i < 440; i++) 
    *value++ = i; 


    return 0; 

私のミスを特定するのに役立つ人はいますか? GB

+0

これは、DLLベースでどのように動作するのか、実際にはわかりません。ヒープapiが特定のモジュールによって呼び出されたかどうかを判断する唯一の方法は、すべての呼び出しでスタックバックトレースを実行することです。 –

答えて

3

/dllsは、Win32 API HeapAllocを呼び出すDLLに影響します。 new []で割り当てるので、あなたが指定する必要があるDLLは実際にはCランタイム(例えばmsvcrt90.dll)です。

+0

はい!それは今働きます!私はDLLを所有しているので、Cランタイムと静的リンクを結ぶことができたので、msvcrt90.dllではなく特定のDLLを完全にチェックできるようになりました。とても感謝しています !!! –

関連する問題