typelibraryconverterdlg.cpp
来自「这是VCF框架的代码」· C++ 代码 · 共 1,668 行 · 第 1/4 页
CPP
1,668 行
int coClassCount = pTypeLibHolder->m_coClasses.size(); for ( int i=0;i<coClassCount;i++) { CoClassHolder* pCoClass = pTypeLibHolder->m_coClasses[i]; result += "#include \"" + pCoClass->m_className + ".h\"\n"; } result += "\n\n"; result += "using namespace VCF;\n"; if ( TRUE == this->m_useTLBAsNamespace ) { result += "using namespace " + pTypeLibHolder->m_typeLibName + ";\n"; } result += "\n\n"; result += GenerateClassRegFunctionImpl( pTypeLibHolder ); return result;}void TypeLibraryConverterDlg::GenerateSingleFileForIFaceEnumsSeparateCoClasses( TypeLibHolder* pTypeLibHolder ){}void TypeLibraryConverterDlg::GenerateImplementation( TypeLibHolder* pTypeLibHolder ){ if ( m_cppDir.GetAt(m_cppDir.GetLength()-1) != '\\' ) { m_cppDir += "\\"; } if ( m_headerDir.GetAt(m_headerDir.GetLength()-1) != '\\' ) { m_headerDir += "\\"; } if ( TRUE == m_singleUnitPerClass ) { GenerateSingleUnitperClassImpl( pTypeLibHolder ); } else { switch ( this->m_fileDistributionType ) { case SINGLE_FILE_FOR_TLB : { GenerateSingleFileForTLB( pTypeLibHolder ); } break; case SINGLE_FILE_FOR_IFACE_COCLASS : { GenerateSingleFileForIFaceSeparateCoClasses( pTypeLibHolder ); } break; case SINGLE_FILE_FOR_IFACE_TYPEDEF_COCLASS : { GenerateSingleFileForIFaceEnumsSeparateCoClasses( pTypeLibHolder ); } break; } }}void TypeLibraryConverterDlg::LoadSettingsFromRegistry(){ HKEY currentUser = HKEY_CURRENT_USER; HKEY settings; CString regSettings; regSettings.LoadString( IDS_REG_SETTINGS ); int err = RegOpenKeyEx( currentUser, regSettings, 0, KEY_ALL_ACCESS, &settings ); if ( err != ERROR_SUCCESS ) { CreateRegistrySettings(); } else { DWORD type = 0; BYTE* buf = NULL; DWORD size = 0; err = RegQueryValueEx( settings, "getMethodPrefix", 0, &type, NULL, &size ); if ( err == ERROR_SUCCESS ){ if ( (type == REG_SZ) && (size > 0) ){ buf = new BYTE[size]; memset( buf, 0, size ); err = RegQueryValueEx( settings, "getMethodPrefix", 0, &type, buf, &size ); if ( err == ERROR_SUCCESS ){ m_getMethodPrefix = (char*)buf; } delete [] buf; } } err = RegQueryValueEx( settings, "setMethodPrefix", 0, &type, NULL, &size ); if ( err == ERROR_SUCCESS ){ if ( (type == REG_SZ) && (size > 0) ){ buf = new BYTE[size]; memset( buf, 0, size ); err = RegQueryValueEx( settings, "setMethodPrefix", 0, &type, buf, &size ); if ( err == ERROR_SUCCESS ){ m_setMethodPrefix = (char*)buf; } delete [] buf; } } err = RegQueryValueEx( settings, "memberPrefix", 0, &type, NULL, &size ); if ( err == ERROR_SUCCESS ){ if ( (type == REG_SZ) && (size > 0) ){ buf = new BYTE[size]; memset( buf, 0, size ); err = RegQueryValueEx( settings, "memberPrefix", 0, &type, buf, &size ); if ( err == ERROR_SUCCESS ){ m_memberPrefix = (char*)buf; } delete [] buf; } } err = RegQueryValueEx( settings, "classPrefix", 0, &type, NULL, &size ); if ( err == ERROR_SUCCESS ){ if ( (type == REG_SZ) && (size > 0) ){ buf = new BYTE[size]; memset( buf, 0, size ); err = RegQueryValueEx( settings, "classPrefix", 0, &type, buf, &size ); if ( err == ERROR_SUCCESS ){ m_classPrefix = (char*)buf; } delete [] buf; } } err = RegQueryValueEx( settings, "baseClass", 0, &type, NULL, &size ); if ( err == ERROR_SUCCESS ){ if ( (type == REG_SZ) && (size > 0) ){ buf = new BYTE[size]; memset( buf, 0, size ); err = RegQueryValueEx( settings, "baseClass", 0, &type, buf, &size ); if ( err == ERROR_SUCCESS ){ m_baseClass = (char*)buf; } delete [] buf; } } size = 4; type = REG_DWORD; DWORD boolVal = 0; err = RegQueryValueEx( settings, "singleUnitPerClass", 0, &type, (BYTE*)&boolVal, &size ); m_singleUnitPerClass = boolVal; size = 4; type = REG_DWORD; boolVal = 0; err = RegQueryValueEx( settings, "useFunctionComments", 0, &type, (BYTE*)&boolVal, &size ); m_useFunctionComments = boolVal; size = 4; type = REG_DWORD; boolVal = 0; err = RegQueryValueEx( settings, "useCPPComments", 0, &type, (BYTE*)&boolVal, &size ); m_useCPPComments = boolVal; size = 4; type = REG_DWORD; boolVal = 0; err = RegQueryValueEx( settings, "useJavaDocParamComments", 0, &type, (BYTE*)&boolVal, &size ); m_useJavaDocParamComments = boolVal; size = 4; type = REG_DWORD; DWORD dwVal = 0; err = RegQueryValueEx( settings, "fileDistribution", 0, &type, (BYTE*)&dwVal, &size ); m_fileDistributionType = dwVal; } RegCloseKey( settings );}void TypeLibraryConverterDlg::CreateRegistrySettings(){ HKEY currentUser = HKEY_CURRENT_USER; HKEY settings; CString regSettings; regSettings.LoadString( IDS_REG_SETTINGS ); DWORD disposition = 0; int err = RegCreateKeyEx( currentUser, regSettings, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &settings, &disposition ); if ( err == ERROR_SUCCESS ) { const unsigned char* val = (const unsigned char*)m_getMethodPrefix.GetBuffer(0); err = RegSetValueEx( settings, "getMethodPrefix", 0, REG_SZ, val, m_getMethodPrefix.GetLength() ); m_getMethodPrefix.ReleaseBuffer(); val = (const unsigned char*)m_setMethodPrefix.GetBuffer(0); err = RegSetValueEx( settings, "setMethodPrefix", 0, REG_SZ, val, m_setMethodPrefix.GetLength() ); m_setMethodPrefix.ReleaseBuffer(); val = (const unsigned char*)m_memberPrefix.GetBuffer(0); err = RegSetValueEx( settings, "memberPrefix", 0, REG_SZ, val, m_memberPrefix.GetLength() ); m_memberPrefix.ReleaseBuffer(); val = (const unsigned char*)m_classPrefix.GetBuffer(0); err = RegSetValueEx( settings, "classPrefix", 0, REG_SZ, val, m_classPrefix.GetLength() ); m_classPrefix.ReleaseBuffer(); val = (const unsigned char*)m_baseClass.GetBuffer(0); err = RegSetValueEx( settings, "baseClass", 0, REG_SZ, val, m_baseClass.GetLength() ); m_baseClass.ReleaseBuffer(); DWORD boolval = (DWORD)m_singleUnitPerClass; err = RegSetValueEx( settings, "singleUnitPerClass", 0, REG_DWORD, (BYTE*)&boolval, sizeof(boolval) ); DWORD dwVal = m_fileDistributionType; err = RegSetValueEx( settings, "fileDistribution", 0, REG_DWORD, (BYTE*)&dwVal, sizeof(dwVal) ); boolval = (DWORD)m_useFunctionComments; err = RegSetValueEx( settings, "useLowerCaseFuncNames", 0, REG_DWORD, (BYTE*)&boolval, sizeof(boolval) ); boolval = (DWORD)m_useCPPComments; err = RegSetValueEx( settings, "useCPPComments", 0, REG_DWORD, (BYTE*)&boolval, sizeof(boolval) ); boolval = (DWORD)m_useLowerCaseFuncNames; err = RegSetValueEx( settings, "useLowerCaseFuncNames", 0, REG_DWORD, (BYTE*)&boolval, sizeof(boolval) ); boolval = (DWORD)m_useJavaDocParamComments; err = RegSetValueEx( settings, "useJavaDocParamComments", 0, REG_DWORD, (BYTE*)&boolval, sizeof(boolval) ); RegCloseKey( settings ); }}void TypeLibraryConverterDlg::SaveSettingsToRegistry(){ HKEY currentUser = HKEY_CURRENT_USER; HKEY settings; CString regSettings; regSettings.LoadString( IDS_REG_SETTINGS ); DWORD disposition = 0; int err = RegOpenKeyEx( currentUser, regSettings, 0, KEY_ALL_ACCESS, &settings ); if ( err == ERROR_SUCCESS ) { const unsigned char* val = (const unsigned char*)m_getMethodPrefix.GetBuffer(0); err = RegSetValueEx( settings, "getMethodPrefix", 0, REG_SZ, val, m_getMethodPrefix.GetLength() ); m_getMethodPrefix.ReleaseBuffer(); val = (const unsigned char*)m_setMethodPrefix.GetBuffer(0); err = RegSetValueEx( settings, "setMethodPrefix", 0, REG_SZ, val, m_setMethodPrefix.GetLength() ); m_setMethodPrefix.ReleaseBuffer(); val = (const unsigned char*)m_memberPrefix.GetBuffer(0); err = RegSetValueEx( settings, "memberPrefix", 0, REG_SZ, val, m_memberPrefix.GetLength() ); m_memberPrefix.ReleaseBuffer(); val = (const unsigned char*)m_classPrefix.GetBuffer(0); err = RegSetValueEx( settings, "classPrefix", 0, REG_SZ, val, m_classPrefix.GetLength() ); m_classPrefix.ReleaseBuffer(); val = (const unsigned char*)m_baseClass.GetBuffer(0); err = RegSetValueEx( settings, "baseClass", 0, REG_SZ, val, m_baseClass.GetLength() ); m_baseClass.ReleaseBuffer(); DWORD boolval = (DWORD)m_singleUnitPerClass; err = RegSetValueEx( settings, "singleUnitPerClass", 0, REG_DWORD, (BYTE*)&boolval, sizeof(boolval) ); boolval = (DWORD)m_useFunctionComments; err = RegSetValueEx( settings, "useLowerCaseFuncNames", 0, REG_DWORD, (BYTE*)&boolval, sizeof(boolval) ); boolval = (DWORD)m_useCPPComments; err = RegSetValueEx( settings, "useCPPComments", 0, REG_DWORD, (BYTE*)&boolval, sizeof(boolval) ); boolval = (DWORD)m_useLowerCaseFuncNames; err = RegSetValueEx( settings, "useLowerCaseFuncNames", 0, REG_DWORD, (BYTE*)&boolval, sizeof(boolval) ); boolval = (DWORD)m_useJavaDocParamComments; err = RegSetValueEx( settings, "useJavaDocParamComments", 0, REG_DWORD, (BYTE*)&boolval, sizeof(boolval) ); DWORD dwVal = m_fileDistributionType; err = RegSetValueEx( settings, "fileDistribution", 0, REG_DWORD, (BYTE*)&dwVal, sizeof(dwVal) ); RegCloseKey( settings ); } else { CreateRegistrySettings(); }}void TypeLibraryConverterDlg::InitializeProgress( TypeLibHolder* pTypeLibHolder ){ m_progressLabel.SetWindowText( "" ); m_conversionProgress.SetPos( 0 ); int max = pTypeLibHolder->m_coClasses.size(); int count = max; for (int i=0;i<count;i++) { CoClassHolder* coClass = pTypeLibHolder->m_coClasses[i]; max += coClass->m_implementedInterfaces.size(); int ic = coClass->m_implementedInterfaces.size(); for ( int j=0;j<ic;j++) { max += coClass->m_implementedInterfaces[j]->m_methods.size(); } } max += pTypeLibHolder->m_interfaces.size(); std::map<_bstr_t,InterfaceHolder*>::iterator it = pTypeLibHolder->m_interfaces.begin(); while ( it != pTypeLibHolder->m_interfaces.end() ) { max += (it->second)->m_methods.size(); it ++; } m_conversionProgress.SetRange( 0, max ); m_conversionProgress.SetStep( 1 ); m_progressLabel.ShowWindow( SW_SHOW ); m_conversionProgress.ShowWindow( SW_SHOW );}void TypeLibraryConverterDlg::FinishProgress(){ m_progressLabel.ShowWindow( SW_HIDE ); m_conversionProgress.ShowWindow( SW_HIDE );}void TypeLibraryConverterDlg::UpdateProgress( CString message ){ m_progressLabel.SetWindowText( message ); m_conversionProgress.StepIt(); m_progressLabel.Invalidate(); m_conversionProgress.Invalidate();}CString TypeLibraryConverterDlg::GenerateClassRegFunction( TypeLibHolder* pTypeLibHolder ){ CString result = ""; result += "void register"+ pTypeLibHolder->m_typeLibName + "Classes();\n"; return result;} CString TypeLibraryConverterDlg::GenerateClassRegFunctionImpl( TypeLibHolder* pTypeLibHolder ){ CString result = ""; result += "void register"+ pTypeLibHolder->m_typeLibName + "Classes()\n"; result += "{\n"; int coClassCount = pTypeLibHolder->m_coClasses.size(); for (int i=0;i<coClassCount;i++) { CoClassHolder* coClass = pTypeLibHolder->m_coClasses[i]; result += "\tREGISTER_CLASSINFO( " + coClass->m_className + " );\n"; } result += "}\n\n"; return result;}void TypeLibraryConverterDlg::OnBrowseForHdrDir() { BROWSEINFO info = {0}; TCHAR displayName[MAX_PATH]; memset(displayName,0,MAX_PATH); CString title = "Browse for Header(*.h) Directory"; info.hwndOwner = ::GetActiveWindow(); info.pidlRoot = NULL; info.pszDisplayName = displayName; info.lpszTitle = title.GetBuffer(0); info.ulFlags = 0; LPITEMIDLIST itemIDList = SHBrowseForFolder( &info ); if ( NULL != itemIDList ){ TCHAR path[MAX_PATH]; memset(path,0,MAX_PATH); if ( TRUE == SHGetPathFromIDList( itemIDList, path ) ){ this->m_headerDir = path; if ( m_headerDir.GetAt(m_headerDir.GetLength()-1) != '\\' ) { m_headerDir += "\\"; } UpdateData( FALSE ); } } title.ReleaseBuffer();}void TypeLibraryConverterDlg::OnBrowseForCppDir() { BROWSEINFO info = {0}; TCHAR displayName[MAX_PATH]; memset(displayName,0,MAX_PATH); CString title = "Browse for CPP(*.cpp) Directory"; info.hwndOwner = ::GetActiveWindow(); info.pidlRoot = NULL; info.pszDisplayName = displayName; info.lpszTitle = title.GetBuffer(0); info.ulFlags = 0; LPITEMIDLIST itemIDList = SHBrowseForFolder( &info ); if ( NULL != itemIDList ){ TCHAR path[MAX_PATH]; memset(path,0,MAX_PATH); if ( TRUE == SHGetPathFromIDList( itemIDList, path ) ){ this->m_cppDir = path; if ( m_cppDir.GetAt(m_cppDir.GetLength()-1) != '\\' ) { m_cppDir += "\\"; } UpdateData( FALSE ); } } title.ReleaseBuffer();}void TypeLibraryConverterDlg::OnAddToProject() { this->m_addToProject = !m_addToProject; UpdateData();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?