typelibraryconverterdlg.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 1,668 行 · 第 1/4 页

CPP
1,668
字号
// TestDlg.cpp : implementation file//#include "stdafx.h"#include "Test.h"#include "TypeLibraryConverterDlg.h"#include "TypeLibContents.h"#include <comdef.h>#include "ConversionOptionsDlg.h"#include "TypelibDump.h"#include "TypeConversionOptionsPage.h"#include "SourceFormattingOptionsPage.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifstd::map<CString,CString> TypeLibraryConverterDlg::g_TypeConversionMap;/////////////////////////////////////////////////////////////////////////////// TypeLibraryConverterDlg dialogTypeLibraryConverterDlg::TypeLibraryConverterDlg(CWnd* pParent /*=NULL*/)	: CDialog(TypeLibraryConverterDlg::IDD, pParent){	//{{AFX_DATA_INIT(TypeLibraryConverterDlg)	m_cppDir = _T("");	m_headerDir = _T("");	m_addToProject = FALSE;	//}}AFX_DATA_INIT	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);		m_getMethodPrefix = _T("get");	m_setMethodPrefix = _T("set");	m_memberPrefix = _T("m_");	m_singleUnitPerClass = TRUE;	m_classPrefix = _T("");	m_fileDistributionType = -1;}void TypeLibraryConverterDlg::DoDataExchange(CDataExchange* pDX){	CDialog::DoDataExchange(pDX);	//{{AFX_DATA_MAP(TypeLibraryConverterDlg)	DDX_Control(pDX, IDC_CONVERT_PROGRESS, m_conversionProgress);	DDX_Control(pDX, IDC_PROGRESS_LABEL, m_progressLabel);	DDX_Control(pDX, IDC_TYPELIB_LIST, m_typeLibList);	DDX_Text(pDX, IDC_CPP_DIR, m_cppDir);	DDX_Text(pDX, IDC_HEADER_DIR, m_headerDir);	DDX_Check(pDX, IDC_ADD_TO_PROJECT, m_addToProject);	//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(TypeLibraryConverterDlg, CDialog)	//{{AFX_MSG_MAP(TypeLibraryConverterDlg)	ON_WM_SYSCOMMAND()	ON_WM_PAINT()	ON_WM_QUERYDRAGICON()	ON_BN_CLICKED(IDC_CONVERT, OnConvert)	ON_WM_DESTROY()	ON_BN_CLICKED(IDC_OPTIONS, OnOptions)	ON_BN_CLICKED(IDC_BROWSE_FOR_HDR_DIR, OnBrowseForHdrDir)	ON_BN_CLICKED(IDC_BROWSE_FOR_CPP_DIR, OnBrowseForCppDir)	ON_BN_CLICKED(IDC_ADD_TO_PROJECT, OnAddToProject)	//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// TypeLibraryConverterDlg message handlersBOOL TypeLibraryConverterDlg::OnInitDialog(){	//	CDialog::OnInitDialog();	LoadSettingsFromRegistry();	g_TypeConversionMap[ CString("VARIANT") ] = CString("VCF::VariantData");	g_TypeConversionMap[ CString("BSTR") ] = CString("VCF::String");	g_TypeConversionMap[ CString("IUnknown") ] = CString("VCF::Object");	g_TypeConversionMap[ CString("IDispatch") ] = CString("VCF::Object");	g_TypeConversionMap[ CString("HRESULT") ] = CString("unsigned long");	m_imageList.Create( 16, 16, ILC_COLOR4 | ILC_MASK, 0, 5 );	CBitmap bmp;	{		AFX_MANAGE_STATE( AfxGetModuleState() );		bmp.LoadBitmap( IDB_TYPELIB );		m_imageList.Add( &bmp, RGB(0,255,0) );		bmp.Detach();				bmp.LoadBitmap( IDB_INTERFACE );		m_imageList.Add( &bmp, RGB(0,255,0) );		bmp.Detach();				bmp.LoadBitmap( IDB_COCLASS );		m_imageList.Add( &bmp, RGB(0,255,0) );		bmp.Detach();					bmp.LoadBitmap( IDB_INSERTABLE_COCLASS );		m_imageList.Add( &bmp, RGB(0,255,0) );		bmp.Detach();	}		this->m_typeLibList.SetImageList( &m_imageList, LVSIL_SMALL );	m_typeLibList.InsertColumn( 0, "Registered Type Libraries", LVCFMT_LEFT, 400 );	ExpandTypeLibs();		TCHAR currentDir[MAX_PATH];	memset(currentDir, 0, MAX_PATH);	GetCurrentDirectory( MAX_PATH, currentDir );	this->m_cppDir = currentDir;	if ( m_cppDir.GetAt(m_cppDir.GetLength()-1) != '\\' ) {		m_cppDir += "\\";	}	this->m_headerDir = currentDir;	if ( m_headerDir.GetAt(m_headerDir.GetLength()-1) != '\\' ) {		m_headerDir += "\\";	}	UpdateData( FALSE );	return TRUE;  // return TRUE  unless you set the focus to a control}void TypeLibraryConverterDlg::ExpandTypeLibs(){	AFX_MANAGE_STATE( AfxGetModuleState() );	USES_CONVERSION;	HKEY    hkTypeLib ;	if (RegOpenKey( HKEY_CLASSES_ROOT, _T("TypeLib"), &hkTypeLib) == ERROR_SUCCESS)	{		LONG    cb ;		TCHAR    szVer[64] ;		TCHAR    szName[64] ;		TCHAR    szGUID[64] ;		TCHAR    szBuf[256] ;		DWORD   dwIndex, dwIndex2 ;		HKEY    hkGUID ;		// Enum \TypeInfo		for ( dwIndex = 0 ;			  RegEnumKey( hkTypeLib, dwIndex, szGUID, sizeof(szGUID)) == ERROR_SUCCESS ;			  ++dwIndex )		{			// Gotta open \TypeInfo\szGUID			if (RegOpenKey( hkTypeLib, szGUID, &hkGUID ) == ERROR_SUCCESS)			{				// Enum all at this level (major.minor = name)				for (dwIndex2 = 0 ;					RegEnumKey( hkGUID, dwIndex2, szVer, sizeof(szVer)) == ERROR_SUCCESS ;					++dwIndex2 )				{					cb = sizeof(szName);					if (RegQueryValue( hkGUID, (LPTSTR)szVer, szName, &cb) == ERROR_SUCCESS)					{						wsprintf( szBuf, _T("%s (Ver %s)"), (LPTSTR)szName, (LPTSTR)szVer ) ;												GUID classID = {0};						PTSTR p = strrchr( szVer, '.' ) ;												::CLSIDFromString(T2OLE(szGUID), &classID);						TypeLibEntry* pTLBEntry = new TypeLibEntry( classID, (WORD)atoi( szVer ), (WORD)atoi( p+1 ) );						m_tlbEntrys.push_back( pTLBEntry );						//						//lpOD->m_szProgID[0] = '\0' ;						//lpOD->m_uiBitmap = BMINDEX(IDB_AUTOMATION) ;						//lpOD->m_wMajorVer =  ;												//if (p)						//	lpOD->m_wMinorVer =  ;						//else						//	lpOD->m_wMinorVer = 0 ;						LVITEM item = {0} ;						item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;						item.iItem  = dwIndex;						item.iImage = 0;						item.lParam = (LPARAM)pTLBEntry;												pTLBEntry->m_tlbName = szBuf;						item.pszText = szBuf;						item.cchTextMax = strlen( szBuf );						m_typeLibList.InsertItem( &item );											}				}				RegCloseKey( hkGUID ) ;			}		}		RegCloseKey( hkTypeLib ) ;	}}void TypeLibraryConverterDlg::OnSysCommand(UINT nID, LPARAM lParam){	CDialog::OnSysCommand(nID, lParam);}// If you add a minimize button to your dialog, you will need the code below//  to draw the icon.  For MFC applications using the document/view model,//  this is automatically done for you by the framework.void TypeLibraryConverterDlg::OnPaint() {	if (IsIconic())	{		CPaintDC dc(this); // device context for painting		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);		// Center icon in client rectangle		int cxIcon = GetSystemMetrics(SM_CXICON);		int cyIcon = GetSystemMetrics(SM_CYICON);		CRect rect;		GetClientRect(&rect);		int x = (rect.Width() - cxIcon + 1) / 2;		int y = (rect.Height() - cyIcon + 1) / 2;		// Draw the icon		dc.DrawIcon(x, y, m_hIcon);	}	else	{		CDialog::OnPaint();	}}// The system calls this to obtain the cursor to display while the user drags//  the minimized window.HCURSOR TypeLibraryConverterDlg::OnQueryDragIcon(){	return (HCURSOR) m_hIcon;}void TypeLibraryConverterDlg::OnConvert() {	ITypeLib* pTypeLib ;	LCID      lcid = GetUserDefaultLCID() ;	int i = m_typeLibList.GetSelectionMark();	CString s = m_typeLibList.GetItemText( i, 0 );	TRACE( "Item %d, text = %s\n", i, s.GetBuffer(0) );	s.ReleaseBuffer();	if ( i >= 0 ) {		//		TypeLibEntry* tlb = (TypeLibEntry*)m_typeLibList.GetItemData( i ); //m_tlbEntrys[i];		HRESULT hr = ::LoadRegTypeLib( tlb->m_classID, tlb->m_wMajorVer,								   tlb->m_wMinorVer, lcid, &pTypeLib ) ;		if ( SUCCEEDED( hr ) ) {			TypeLibContents dlg;			CString label;			wchar_t tmp[256];			memset( tmp, 0, sizeof(wchar_t)*256 );			LPOLESTR tmpOleStr = tmp;			::StringFromCLSID( tlb->m_classID, &tmpOleStr );			_bstr_t clsid = tmpOleStr;			label.Format( "Listing for Type Library \"%s\", CLSID %s",  tlb->m_tlbName.GetBuffer(0), (char*)clsid );			tlb->m_tlbName.ReleaseBuffer();			dlg.m_typeLibLabel = label;			dlg.m_pTypeLib = pTypeLib;			if ( IDOK == dlg.DoModal() ) {				m_convertCoClasses = dlg.m_convertCoClasses;				m_useATLForCoClassImpl = dlg.m_useATLForCoClassImpl;				m_useTLBAsNamespace = dlg.m_useTLBAsNamespace;				TypeLibHolder tlib;				CWaitCursor wait;				hr = GenerateTypeLibHolder( pTypeLib, tlib );				if ( SUCCEEDED(hr) ) {					InitializeProgress( &tlib );					GenerateImplementation( &tlib );					FinishProgress();				}			}			int i = pTypeLib->Release();		}	}	}void TypeLibraryConverterDlg::OnDestroy() {	CDialog::OnDestroy();	SaveSettingsToRegistry();	std::vector<TypeLibEntry*>::iterator it = m_tlbEntrys.begin();	while ( it != m_tlbEntrys.end() ) {		TypeLibEntry* tlb = *it;		delete tlb;		tlb = NULL;		it++;	}	m_tlbEntrys.clear();	}void TypeLibraryConverterDlg::OnOptions() {	CPropertySheet dlg;	ConversionOptionsDlg page1;	TypeConversionOptionsPage page2;	SourceFormattingOptionsPage page3;	dlg.AddPage( &page1 );	dlg.AddPage( &page2 );	dlg.AddPage( &page3 );	dlg.SetTitle( "Options" );		dlg.m_psh.dwFlags |= PSH_NOAPPLYNOW;	page1.m_classPrefix = this->m_classPrefix;	page1.m_getMethodPrefix = this->m_getMethodPrefix;	page1.m_memberPrefix = this->m_memberPrefix;	page1.m_setMethodPrefix = this->m_setMethodPrefix;	page1.m_singleUnitPerClass = this->m_singleUnitPerClass;	page1.m_fileDistributionType = this->m_fileDistributionType;	page1.m_baseClass = this->m_baseClass;	page3.m_useFunctionComments = this->m_useFunctionComments;	page3.m_useCPPComments = this->m_useCPPComments;	page3.m_useLowerCaseFuncNames = this->m_useLowerCaseFuncNames;	page3.m_useJavaDocParamComments = this->m_useJavaDocParamComments;			if ( IDOK == dlg.DoModal() ) {		this->m_classPrefix = page1.m_classPrefix;		this->m_getMethodPrefix = page1.m_getMethodPrefix;		this->m_memberPrefix = page1.m_memberPrefix;		this->m_setMethodPrefix = page1.m_setMethodPrefix;		this->m_singleUnitPerClass = page1.m_singleUnitPerClass;		this->m_fileDistributionType = page1.m_fileDistributionType;		this->m_baseClass = page1.m_baseClass;		this->m_useFunctionComments = page3.m_useFunctionComments;		this->m_useCPPComments = page3.m_useCPPComments;		this->m_useLowerCaseFuncNames = page3.m_useLowerCaseFuncNames;		this->m_useJavaDocParamComments = page3.m_useJavaDocParamComments;		this->SaveSettingsToRegistry();	}}CString TypeLibraryConverterDlg::GenerateMethodComments( MethodHolder* pMethod, int indent ){	CString result = "";	CString tabString = "";	for (int i=0;i<indent;i++) {		tabString += "\t";	}	if ( this->m_useFunctionComments ) {		if ( this->m_useCPPComments ) {			result += tabString + "//\n";			int argCount = pMethod->m_arguments.size();				for ( int i=0;i<argCount;i++) {					MethodArgumentHolder& arg = pMethod->m_arguments[i];					result += tabString + "//@param ";					result += arg.m_argType;					result += " " + arg.m_argName;					result += " - \n";				}				CString returnType = (TCHAR*)pMethod->m_returnType;				if ( returnType != "void" ) {					result += tabString + "//@return " + returnType + " - \n";				}		}		else {			if ( this->m_useJavaDocParamComments ) {				result += tabString +"/**\n";// + tabString + "*\n" + tabString + "*/\n";				int argCount = pMethod->m_arguments.size();				for ( int i=0;i<argCount;i++) {					MethodArgumentHolder& arg = pMethod->m_arguments[i];					result += tabString + "*@param ";					result += arg.m_argType;					result += " " + arg.m_argName;					result += " - \n";				}				CString returnType = (TCHAR*)pMethod->m_returnType;				if ( returnType != "void" ) {					result += tabString + "*@return " + returnType + " - \n";				}				result += tabString + "*/\n";			}			else {				result += tabString +"/**\n" + tabString + "*\n" + tabString + "*/\n";				}					}				}		return result;}CString TypeLibraryConverterDlg::GenerateCoClassHeader( CoClassHolder* pCoClass, TypeLibHolder* pTypeLibHolder ){	CString header = "";	CString uuid = (TCHAR*)pCoClass->m_classID;	uuid.Delete(0,1);	uuid.Delete(uuid.GetLength()-1,1);	CString coClassName = (TCHAR*)pTypeLibHolder->m_typeLibName;	coClassName += "_" + pCoClass->m_className;	coClassName.MakeUpper();			header = "";	header += "//";	header += pCoClass->m_className;	header += ".h\n\n";

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?