MyBean不带包DLL窗口,多任务栏的解决

MyBeanDLL带包运行时,DLL窗体不会出现在任务栏上,但如果不带包运行时,则DLL窗体则也会出现在任务栏上,这是因为DLL里的Application和主程序的Application不是同一个。

按以往DLL窗体的方法,可以把主窗体的Application传给DLL;MyBean则要在DLL里主动去获取,方法如下:把主程序也做为插件,并增加获取Application的接口,DLL里用今天(2014-09-18)新增的BeforeGetBean事件,在这个事件中去获取主程序的Application。

BCB的代码如下:

EXE主程序:

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
	try
	{
		Application->Initialize();
		applicationContextInitialize();
		registerFactoryObject(getBeanFactory(),"MainApp");
		Application->MainFormOnTaskBar = true;
		TMyBeanFactoryTools::getBean("MainApp");
//		Application->CreateForm(__classid(TForm1), &Form1);
		Application->Run();
	}
	catch (Exception &exception)
	{
		Application->ShowException(&exception);
	}
	catch (...)
	{
		try
		{
			throw Exception("");
		}
		catch (Exception &exception)
		{
			Application->ShowException(&exception);
		}
	}
	return 0;
}
//---------------------------------------------------------------------------
void __fastcall PACKAGE RegisterUI()
{
 #pragma startup RegisterUI
 (beanFactory())->RegisterBean("MainApp",__classid(TForm1),true)->IsMainForm=true;
}
//---------------------------------------------------------------------------
#define INTF_IMP_REFCOUNT(BASE) \
 ULONG __stdcall AddRef() { return BASE::_AddRef();} \
 ULONG __stdcall Release(){ return BASE::_Release();}\
 HRESULT __stdcall QueryInterface(REFIID iid, void*p) { return BASE::QueryInterface(iid, p);}
 
__interface IMainApp;
typedef System::DelphiInterface<IMainApp> _di_IMainApp;
__interface __declspec(uuid("{0DAA1A1E-CB13-46E1-BF9F-D54D8B117F25}")) IMainApp: public IInterface
{

public:
 virtual TApplication * __stdcall GetHandle(void) = 0 ;
};
//---------------------------------------------------------------------------
class TMainApp : public Vcl::Forms::TForm,IMainApp
{
 typedef Vcl::Forms::TForm inherited;

private:
 System::UnicodeString FInstanceID;

protected:
 TApplication * __stdcall GetHandle(void);
public:
 __fastcall virtual TMainApp(System::Classes::TComponent* AOwner);
 __fastcall virtual ~TMainApp(void);
 INTF_IMP_REFCOUNT(TForm); };
//---------------------------------------------------------------------------
TApplication * __stdcall TMainApp::GetHandle(void)
{
 return Application;
}

DLL:

TApplication * SaveApp=NULL;
//---------------------------------------------------------------------------
void __stdcall MyPluginInfoProc(TPluginInfo* pvObject)
{
 if(!SaveApp)
   {
	_di_IMainApp MainApp;
	MainApp=TMyBeanFactoryTools::getBean("MainApp");
	if(((int)MainApp->GetHandle()->Handle)>0)
	  {
	   SaveApp=Application;
	   Application=MainApp->GetHandle();
	  }
   }
}
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
 if(reason==DLL_PROCESS_ATTACH)
   {
	(beanFactory())->BeforeGetBean=MyPluginInfoProc;
	(beanFactory())->RegisterBean("Test",__classid(TForm1),true);
   }
 else if(reason==DLL_PROCESS_DETACH&&SaveApp)
   {
	Application=SaveApp;
   }
	return 1;
}

 

 

分享到: