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 + -
显示快捷键?