예제 #1
0
void CDriverWizardAppWiz::CustomizeProject(IBuildProject* pProject)
{
	// TODO: Add code here to customize the project.  If you don't wish
	//  to customize project, you may remove this virtual override.
	
	// This is called immediately after the default Debug and Release
	//  configurations have been created for each platform.  You may customize
	//  existing configurations on this project by using the methods
	//  of IBuildProject and IConfiguration such as AddToolSettings,
	//  RemoveToolSettings, and AddCustomBuildStep. These are documented in
	//  the Developer Studio object model documentation.

	// WARNING!!  IBuildProject and all interfaces you can get from it are OLE
	//  COM interfaces.  You must be careful to release all new interfaces
	//  you acquire.  In accordance with the standard rules of COM, you must
	//  NOT release pProject, unless you explicitly AddRef it, since pProject
	//  is passed as an "in" parameter to this function.  See the documentation
	//  on CCustomAppWiz::CustomizeProject for more information.
	CComPtr<IConfigurations> pConfigs;
	HRESULT hr=pProject->get_Configurations(&pConfigs);
	if(FAILED(hr))
	{
		AfxMessageBox("An error occurred while obtaining the IConfigurations interface pointer");
		return;
	}
	CComPtr<IConfiguration> pConfig;
	CComVariant index;
	VARIANT dummy = {0};
	CComBSTR Name;
	CString text;
	CString output;

	long Count=0;
	pConfigs->get_Count(&Count);

	// Iterate through all the configurations of the project
	for(int i=1; i <= Count; i++)
	{
		index=i;
		hr=pConfigs->Item(index, &pConfig);
		if(FAILED(hr))
		{
			AfxMessageBox("An error occurred while obtaining the IConfiguration pointer");
			return;
		}
		pConfig->get_Name(&Name);
		text = Name;
		
		if (text.Find("Debug") == -1)
			output = "Release";
		else
			output = "Debug";

		text.Format("/out:\"%s/%s.exe\"",output,m_Dictionary["Root"]);
		pConfig->RemoveToolSettings(L"link.exe", text.AllocSysString(), dummy);
		text.Format("/out:\"%s/%s.sys\"",output,m_Dictionary["Root"]);
		pConfig->AddToolSettings(L"link.exe", text.AllocSysString(), dummy);
		
		pConfig->AddToolSettings(L"mfc", L"0", dummy);	//None : 0, Static Libraries : 1, Shared Dll : 2
		pConfig->RemoveToolSettings(L"link.exe", L"/subsystem:windows", dummy);
		pConfig->RemoveToolSettings(L"link.exe", L"/incremental:yes", dummy);

		//The NATIVE subsystem applies device drivers for Windows NT.
		pConfig->AddToolSettings(L"link.exe", L"/subsystem:native", dummy);
		pConfig->AddToolSettings(L"link.exe", L"/entry:\"DriverEntry\"", dummy);
		pConfig->AddToolSettings(L"link.exe", L"/driver", dummy);
		pConfig->AddToolSettings(L"link.exe", L"/incremental:no", dummy);

		// change the preprocessor definitions
		pConfig->RemoveToolSettings(L"cl.exe", L"/D \"_WINDOWS\"", dummy);
		pConfig->RemoveToolSettings(L"cl.exe", L"/D \"_MBCS\"", dummy);
		pConfig->RemoveToolSettings(L"cl.exe", L"/Od", dummy);
		pConfig->RemoveToolSettings(L"cl.exe", L"/ZI", dummy);	// Program Database for "Edit & Continue" can not be defined when /driver option is defined
		pConfig->RemoveToolSettings(L"cl.exe", L"/GZ", dummy);	//GZ initializes all local variables not explicitly initialized by the program. It fills all memory used by these variables with 0xCC
		pConfig->AddToolSettings(L"cl.exe", L"/Zi", dummy);	// Program Database
		pConfig->AddToolSettings(L"cl.exe", L"/Oi", dummy);	// 
		pConfig->AddToolSettings(L"cl.exe", L"/Gz", dummy);	// __stdcall calling convention
		pConfig->AddToolSettings(L"cl.exe", L"/D \"_X86_\"", dummy);
		pConfig->AddToolSettings(L"cl.exe", L"/D \"i386\"", dummy);
		pConfig->AddToolSettings(L"cl.exe", L"/D \"STD_CALL\"", dummy);
		pConfig->AddToolSettings(L"cl.exe", L"/D \"CONDITION_HANDLING\"", dummy);
		pConfig->AddToolSettings(L"cl.exe", L"/D \"WIN32_LEAN_AND_MEAN\"", dummy);
		pConfig->AddToolSettings(L"cl.exe", L"/D \"NT_UP\"", dummy);
		pConfig->AddToolSettings(L"cl.exe", L"/D \"SRVDBG\"", dummy);
		pConfig->AddToolSettings(L"cl.exe", L"/D \"DBG\"", dummy);
		pConfig->AddToolSettings(L"cl.exe", L"/D \"_IDWBUILD\"", dummy);
		pConfig->AddToolSettings(L"cl.exe", L"/D \"_WIN32_WINNT=0x0400\"", dummy);
		pConfig->AddToolSettings(L"cl.exe", L"/I \"$(ddkroot)\\inc\\ddk\"", dummy);
		pConfig->AddToolSettings(L"cl.exe", L"/I \"$(ddkroot)\\inc\"", dummy);

		// Change the libraries
		pConfig->RemoveToolSettings(L"link.exe", L"kernel32.lib", dummy);
		pConfig->RemoveToolSettings(L"link.exe", L"user32.lib", dummy);
		pConfig->RemoveToolSettings(L"link.exe", L"gdi32.lib", dummy);
		pConfig->RemoveToolSettings(L"link.exe", L"winspool.lib", dummy);
		pConfig->RemoveToolSettings(L"link.exe", L"comdlg32.lib", dummy);
		pConfig->RemoveToolSettings(L"link.exe", L"advapi32.lib", dummy);
		pConfig->RemoveToolSettings(L"link.exe", L"shell32.lib", dummy);
		pConfig->RemoveToolSettings(L"link.exe", L"ole32.lib", dummy);
		pConfig->RemoveToolSettings(L"link.exe", L"oleaut32.lib", dummy);
		pConfig->RemoveToolSettings(L"link.exe", L"uuid.lib", dummy);
		pConfig->RemoveToolSettings(L"link.exe", L"odbc32.lib", dummy);
		pConfig->RemoveToolSettings(L"link.exe", L"odbccp32.lib", dummy);
		pConfig->AddToolSettings(L"link.exe", L"ntoskrnl.lib", dummy);
		pConfig->AddToolSettings(L"link.exe", L"hal.lib", dummy);
//		pConfig->AddToolSettings(L"link.exe", L"int64.lib", dummy);

		if (output == "Debug")
		{
			pConfig->AddToolSettings(L"link.exe", L"/libpath:\"$(ddkroot)\\libchk\\i386\"", dummy);
			pConfig->AddToolSettings(L"link.exe", L"/libpath:\"$(ddkroot)\\lib\\i386\\checked\"", dummy);
		}
		else
		{
			pConfig->AddToolSettings(L"link.exe", L"/libpath:\"$(ddkroot)\\libfre\\i386\"", dummy);
			pConfig->AddToolSettings(L"link.exe", L"/libpath:\"$(ddkroot)\\lib\\i386\\free\"", dummy);
		}

		pConfig=NULL;
	}
	pConfigs=NULL;
}