GDI+ ve ActiveX register etmeye calisirken regsvr32.exe nin sonlanmamasi

7 Feb
2014

Aslinda tum olay MFC projesinde GDI+ kullanmayla basladi. GDI+ kullanmaya basladiginizda Gdiplus::GdiplusStartup, isiniz bittiginde Gdiplus::GdiplusShutdown fonksiyonlarini cagirmalisiniz. Projede devamli GDI+ kullandigim icin InitInstance() icinde start, ExitInstance() icinde stop yaptim.

 

////////////////////////////////////////////////////////////////////////////
// GDI+ Start Stop functions
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartupOutput gdiplusStartupOutput;
BOOL StartGdiPlus()
{
	if (Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL))
	{
		MessageBox(NULLTEXT("GDI+ failed to start up!"), TEXT("Error!"), MB_ICONERROR);
		return FALSE;
	}
	return TRUE;
}
void StopGdiPlus()
{
	Gdiplus::GdiplusShutdown(gdiplusToken);
}

////////////////////////////////////////////////////////////////////////////
// CActivexApp::InitInstance - DLL initialization

BOOL CActivexApp::InitInstance()
{
	BOOL bInit = COleControlModule::InitInstance();

	if (bInit)
	{
		CoInitialize(NULL);
		StartGdiPlus();

	}

	return bInit;
}

////////////////////////////////////////////////////////////////////////////
// CActivexApp::ExitInstance - DLL termination

int CActivexApp::ExitInstance()
{
	// TODO: Add your own module termination code here.
	StopGdiPlus();
	CoUninitialize();
	return COleControlModule::ExitInstance();
}

/////////////////////////////////////////////////////////////////////////////

 

Buraya kadar hersey normal. Compile ederken de herhangi bir sorun yok. Regsvr32.exe ile register ederken “DllRegisterServer in ActiveX.ocx succeeded” mesajini da aldim. Fakat Task Manager dan baktigimda Regsvr32.exe nin bir turlu sonlanmadigini gordum. Bir kac denemeden sonra init edilen ActiveX in bir turlu FreeLibrary ile bir turlu sonlandirmadigini farkettim.

Muhtemelen Regsvr32.exe birden fazla instance aliyor, boylece birden fazla StartGdiPlus() calisiyor. Sorunun ana kaynagi bu.

Bu konuyu cozmek icin sadece tek instance alinmasini saglamak gerekti. Bunun icin static bir boolean degisken yetti. Tum sorunlar cozuldu.

Son hali asagidadir.

 

////////////////////////////////////////////////////////////////////////////
// GDI+ Start Stop functions
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartupOutput gdiplusStartupOutput;
static bool isGdiplusAlreadyStarted = false;
BOOL StartGdiPlus()
{
	if (isGdiplusAlreadyStarted == false)
	{
		return FALSE;
	}
	if (Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL))
	{
		MessageBox(NULLTEXT("GDI+ failed to start up!"), TEXT("Error!"), MB_ICONERROR);
		return FALSE;
	}
	return TRUE;
}
void StopGdiPlus()
{
	Gdiplus::GdiplusShutdown(gdiplusToken);
}

////////////////////////////////////////////////////////////////////////////
// CActivexApp::InitInstance - DLL initialization

BOOL CActivexApp::InitInstance()
{
	BOOL bInit = COleControlModule::InitInstance();

	if (bInit)
	{
		CoInitialize(NULL);
		StartGdiPlus();

	}

	return bInit;
}
////////////////////////////////////////////////////////////////////////////
// CActivexApp::ExitInstance - DLL termination

int CActivexApp::ExitInstance()
{
	// TODO: Add your own module termination code here.
	StopGdiPlus();
	CoUninitialize();
	return COleControlModule::ExitInstance();
}

/////////////////////////////////////////////////////////////////////////////
Be Sociable, Share!

Comment Form

top