私は、VC2010 と混合 MFC/Win32 を使用してフレームワークを作成しています。いくつかのコントロール タイプがあり、それらはすべて独自のウィンドウ クラスを登録します。そのうちのいくつかは、次の例のように、標準ウィンドウ クラスのいずれかの WindowProc を使用します。
void Button::OnInitClass(WNDCLASS &wndClass)
{
Object::OnInitClass(wndClass);
if(!GetClassInfo(NULL, WC_BUTTON, &wndClass)) {
throw std::exception("Failed getting window class info.");
}
wndClass.lpszClassName = ButtonBase::GetWndClassName();
}
bool Button::Create(CWnd* parent)
{
if(!WndClassInitialized) {
static VSCriticalSection cs;
cs.Enter();
if(!WndClassInitialized) {
WNDCLASS wndClass;
memset(&wndClass, 0, sizeof(WNDCLASS));
OnInitClass(wndClass);
assert(wndClass.lpszClassName);
if(!RegisterClass(&wndClass)) {
throw std::exception("Error registering window class");
}
WndClassInitialized = true;
}
cs.Leave();
}
DWORD style = WS_CHILD | WS_CLIPSIBLINGS | BS_PUSHBUTTON | BS_MULTILINE;
DWORD exStyle = WS_EX_LEFT | WS_EX_LTRREADING;
Created = CWnd::CreateEx(exStyle, ButtonBase::GetWndClassName(), "", style , _attribAnchor.Rect, parent, 0) != FALSE;
SetFont(_font);
return Created;
}
それはすべて長い間機能していましたが、今ではヒープが破損しています。ただし、CreateEx 呼び出しで WC_BUTTON クラスを直接使用すると、ヒープが破損することはありません。
WC_BUTTON から WindowProc を使用するウィンドウ クラスを登録するこの方法が安全かどうかは疑問です。それは...ですか?
安全である場合、当然のことながら、他の場所でヒープの破損の経路を探す必要があります。しかし、そうでない場合、私がやろうとしていることを安全に行う方法はありますか? (つまり、既存のクラスを新しい名前で登録します。これは、任意のウィンドウ ハンドルを指定して、ウィンドウ クラス名からコントロールを認識できるようにするために行います)
文字列の割り当てでヒープの破損が発生し、すべてのパラメーターが正しいように見えることを言及する必要があります。したがって、問題はその前のどこかにあるに違いありません。
前もってありがとう、マーティン