/* * (c) Copyright Ascensio System SIA 2010-2019 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha * street, Riga, Latvia, EU, LV-1050. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ #include "Records.h" #include #include #include #include "../../../UnicodeConverter/UnicodeConverter.h" namespace VBA { const std::string int2str(const int val, const int radix) { static char num_buf[10] = {}; #if defined(_WIN32) || defined(_WIN64) _itoa_s(val, num_buf, 9, radix); #else sprintf(num_buf, "%d", val); #endif return num_buf; } const std::wstring int2wstr(const int val, const int radix) { #if defined(_WIN32) || defined(_WIN64) static wchar_t num_buf[20] = {}; _itow_s(val, num_buf, 19, radix); return std::wstring(num_buf); #else static char num_buf[20] = {}; sprintf(num_buf, "%d", val); std::string a_str(num_buf); return std::wstring(a_str.begin(), a_str.end()); #endif } const std::wstring int2hex_wstr(const int val, const size_t size_of) { if (size_of > 4) return L""; #if defined(_WIN32) || defined(_WIN64) static wchar_t num_buf[10] = {}; std::wstring wstr = int2wstr(size_of << 1, 10); swprintf_s(num_buf, 9, (L"%0" + wstr + L"X").c_str(), val); return std::wstring(num_buf); #else char num_buf[10] = {}; std::string str = int2str(size_of << 1, 10); snprintf(num_buf, 9, ("%0" + str + "X").c_str(), val); std::string res(num_buf); return std::wstring(res.begin(), res.end()); #endif } const std::wstring guid2bstr(const _GUID_ guid) { std::wstring guid_ret = L"{"; guid_ret += int2hex_wstr(guid.Data1, 4) + L"-" + int2hex_wstr(guid.Data2, 2) + L"-" + int2hex_wstr(guid.Data3, 2) + L"-" + int2hex_wstr(guid.Data4[0], 1) + int2hex_wstr(guid.Data4[1], 1) + L"-" + int2hex_wstr(guid.Data4[2], 1) + int2hex_wstr(guid.Data4[3], 1) + int2hex_wstr(guid.Data4[4], 1) + int2hex_wstr(guid.Data4[5], 1) + int2hex_wstr(guid.Data4[6], 1) + int2hex_wstr(guid.Data4[7], 1); return guid_ret + L"}"; } const std::wstring convert_string_icu(const char* buffer, const unsigned int& size, _UINT32 nCodePage) { if (!buffer || size < 1) return L""; std::string sCodePage; std::map::const_iterator pFind = NSUnicodeConverter::mapEncodingsICU.find(nCodePage); if (pFind != NSUnicodeConverter::mapEncodingsICU.end()) { sCodePage = pFind->second; } if (!sCodePage.empty()) { NSUnicodeConverter::CUnicodeConverter oConverter; return oConverter.toUnicode(buffer, size, sCodePage.c_str(), true); } else if (nCodePage != 0) { NSUnicodeConverter::CUnicodeConverter oConverter; return oConverter.toUnicode(buffer, size, nCodePage, true); } else {//текущая локаль std::locale loc(""); std::ctype const &facet = std::use_facet >(loc); std::wstring result; result.resize(size); facet.widen(buffer, buffer + size, &result[0]); return result; } } //------------------------------------------------------------------------------------------ AnsiString::AnsiString(CVbaFileStreamPtr stream) { load(stream); } BaseRecordPtr AnsiString::clone() { return BaseRecordPtr(new AnsiString(*this)); } void AnsiString::load(CVbaFileStreamPtr stream) { _UINT32 sizeOf; *stream >> sizeOf; if (sizeOf > 0) { char *buf = new char[sizeOf]; if (buf) { stream->read(buf, sizeOf); value = convert_string_icu(buf, sizeOf, stream->CodePage); } } } //------------------------------------------------------------------------------------------ Utf16String::Utf16String(CVbaFileStreamPtr stream) { load(stream); } BaseRecordPtr Utf16String::clone() { return BaseRecordPtr(new Utf16String(*this)); } void Utf16String::load(CVbaFileStreamPtr stream) { _UINT32 sizeOf; *stream >> sizeOf; if (sizeOf > 0) { UTF16 *buf = new UTF16[sizeOf / 2]; if (buf) { stream->read(buf, sizeOf); if (sizeof(wchar_t) == 2) { value = std::wstring((wchar_t*)buf, sizeOf / 2); } else { value = convertUtf16ToWString(buf, sizeOf / 2); } } } } //------------------------------------------------------------------------------------------ BaseRecordPtr MODULENAME::clone() { return BaseRecordPtr(new MODULENAME(*this)); } void MODULENAME::load(CVbaFileStreamPtr stream) { ModuleName.load(stream); } //-------------------------------------------------------------------------------- BaseRecordPtr MODULENAMEUNICODE::clone() { return BaseRecordPtr(new MODULENAMEUNICODE(*this)); } void MODULENAMEUNICODE::load(CVbaFileStreamPtr stream) { ModuleNameUnicode.load(stream); } //-------------------------------------------------------------------------------- BaseRecordPtr MODULESTREAMNAME::clone() { return BaseRecordPtr(new MODULESTREAMNAME(*this)); } void MODULESTREAMNAME::load(CVbaFileStreamPtr stream) { _UINT16 Reserved; StreamName.load(stream); *stream >> Reserved; StreamNameUnicode.load(stream); } //-------------------------------------------------------------------------------- BaseRecordPtr MODULEDOCSTRING::clone() { return BaseRecordPtr(new MODULEDOCSTRING(*this)); } void MODULEDOCSTRING::load(CVbaFileStreamPtr stream) { _UINT16 Reserved; DocString.load(stream); *stream >> Reserved; DocStringUnicode.load(stream); } //-------------------------------------------------------------------------------- BaseRecordPtr MODULEOFFSET::clone() { return BaseRecordPtr(new MODULEOFFSET(*this)); } void MODULEOFFSET::load(CVbaFileStreamPtr stream) { _UINT32 SizeOf; *stream >> SizeOf; *stream >> TextOffset; } //-------------------------------------------------------------------------------- BaseRecordPtr MODULEHELPCONTEXT::clone() { return BaseRecordPtr(new MODULEHELPCONTEXT(*this)); } void MODULEHELPCONTEXT::load(CVbaFileStreamPtr stream) { _UINT32 SizeOf; *stream >> SizeOf; *stream >> HelpContext; } //-------------------------------------------------------------------------------- BaseRecordPtr MODULECOOKIE::clone() { return BaseRecordPtr(new MODULECOOKIE(*this)); } void MODULECOOKIE::load(CVbaFileStreamPtr stream) { _UINT32 SizeOf; _UINT16 Cookie; *stream >> SizeOf >> Cookie; } //-------------------------------------------------------------------------------- BaseRecordPtr MODULETYPE::clone() { return BaseRecordPtr(new MODULETYPE(*this)); } void MODULETYPE::load(CVbaFileStreamPtr stream) { _UINT32 Reserved; *stream >> Reserved; } //-------------------------------------------------------------------------------- BaseRecordPtr MODULEREADONLY::clone() { return BaseRecordPtr(new MODULEREADONLY(*this)); } void MODULEREADONLY::load(CVbaFileStreamPtr stream) { _UINT32 Reserved; *stream >> Reserved; } //-------------------------------------------------------------------------------- BaseRecordPtr MODULEPRIVATE::clone() { return BaseRecordPtr(new MODULEPRIVATE(*this)); } void MODULEPRIVATE::load(CVbaFileStreamPtr stream) { _UINT32 Reserved; *stream >> Reserved; } //-------------------------------------------------------------------------------- BaseRecordPtr MODULE::clone() { return BaseRecordPtr(new MODULE(*this)); } void MODULE::load(CVbaFileStreamPtr stream) { bool bEof = false; while (!bEof && stream->checkFitRead(6)) { _UINT16 Id; *stream >> Id; switch (Id) { case rt_MODULENAME: NameRecord = boost::make_shared(stream); break; case rt_MODULENAMEUNICODE: NameUnicodeRecord = boost::make_shared(stream); break; case rt_MODULESTREAMNAME: StreamNameRecord = boost::make_shared(stream); break; case rt_MODULEDOCSTRING: DocStringRecord = boost::make_shared(stream); break; case rt_MODULEOFFSET: OffsetRecord = boost::make_shared(stream); break; case rt_MODULEHELPCONTEXT: HelpContextRecord = boost::make_shared(stream); break; case rt_MODULECOOKIE: { MODULECOOKIE Cookie(stream); } break; case rt_MODULEREADONLY: { bReadOnly = true; MODULEREADONLY ReadOnly(stream); } break; case rt_MODULEPRIVATE: { bPrivate = true; MODULEPRIVATE Private(stream); } break; case rt_MODULETYPE_Procedural: bProceduralModule = true; case rt_MODULETYPE_Class: { MODULETYPE type(stream); } break; case rt_Terminator: { bEof = true; _UINT32 Reserved; *stream >> Reserved; }break; default: _UINT32 SizeOf; *stream >> SizeOf; stream->skipBytes(SizeOf); break; } } } //------------------------------------------------------------------------------------------------------- PROJECTSYSKIND::PROJECTSYSKIND(CVbaFileStreamPtr stream) { load(stream); } BaseRecordPtr PROJECTSYSKIND::clone() { return BaseRecordPtr(new PROJECTSYSKIND(*this)); } void PROJECTSYSKIND::load(CVbaFileStreamPtr stream) { _UINT32 sizeOf; *stream >> sizeOf >> SysKind; } //------------------------------------------------------------------------------- PROJECTCOMPATVERSION::PROJECTCOMPATVERSION(CVbaFileStreamPtr stream) { load(stream); } PROJECTCOMPATVERSION::~PROJECTCOMPATVERSION() {} BaseRecordPtr PROJECTCOMPATVERSION::clone() { return BaseRecordPtr(new PROJECTCOMPATVERSION(*this)); } void PROJECTCOMPATVERSION::load(CVbaFileStreamPtr stream) { _UINT32 sizeOf; *stream >> sizeOf >> CompatVersion; } //------------------------------------------------------------------------------- PROJECTLCID::PROJECTLCID(CVbaFileStreamPtr stream) { load(stream); } PROJECTLCID::~PROJECTLCID() {} BaseRecordPtr PROJECTLCID::clone() { return BaseRecordPtr(new PROJECTLCID(*this)); } void PROJECTLCID::load(CVbaFileStreamPtr stream) { _UINT32 sizeOf; *stream >> sizeOf >> Lcid; } //------------------------------------------------------------------------------- PROJECTLCIDINVOKE::PROJECTLCIDINVOKE(CVbaFileStreamPtr stream) { load(stream); } PROJECTLCIDINVOKE::~PROJECTLCIDINVOKE() {} BaseRecordPtr PROJECTLCIDINVOKE::clone() { return BaseRecordPtr(new PROJECTLCIDINVOKE(*this)); } void PROJECTLCIDINVOKE::load(CVbaFileStreamPtr stream) { _UINT32 sizeOf; *stream >> sizeOf >> LcidInvoke; } //------------------------------------------------------------------------------- PROJECTCODEPAGE::PROJECTCODEPAGE(CVbaFileStreamPtr stream) { load(stream); } PROJECTCODEPAGE::~PROJECTCODEPAGE() {} BaseRecordPtr PROJECTCODEPAGE::clone() { return BaseRecordPtr(new PROJECTCODEPAGE(*this)); } void PROJECTCODEPAGE::load(CVbaFileStreamPtr stream) { _UINT32 sizeOf; *stream >> sizeOf >> CodePage; stream->CodePage = CodePage; } //------------------------------------------------------------------------------- PROJECTNAME::PROJECTNAME(CVbaFileStreamPtr stream) { load(stream); } PROJECTNAME::~PROJECTNAME() {} BaseRecordPtr PROJECTNAME::clone() { return BaseRecordPtr(new PROJECTNAME(*this)); } void PROJECTNAME::load(CVbaFileStreamPtr stream) { ProjectName.load(stream); } //------------------------------------------------------------------------------- PROJECTDOCSTRING::PROJECTDOCSTRING(CVbaFileStreamPtr stream) { load(stream); } PROJECTDOCSTRING::~PROJECTDOCSTRING() {} BaseRecordPtr PROJECTDOCSTRING::clone() { return BaseRecordPtr(new PROJECTDOCSTRING(*this)); } void PROJECTDOCSTRING::load(CVbaFileStreamPtr stream) { unsigned short Reserved; aDocString.load(stream); *stream >> Reserved; uDocString.load(stream); } //------------------------------------------------------------------------------- PROJECTHELPFILEPATH::PROJECTHELPFILEPATH(CVbaFileStreamPtr stream) { load(stream); } PROJECTHELPFILEPATH::~PROJECTHELPFILEPATH() {} BaseRecordPtr PROJECTHELPFILEPATH::clone() { return BaseRecordPtr(new PROJECTHELPFILEPATH(*this)); } void PROJECTHELPFILEPATH::load(CVbaFileStreamPtr stream) { unsigned short Reserved; HelpFile1.load(stream); *stream >> Reserved; HelpFile2.load(stream); } //------------------------------------------------------------------------------- PROJECTHELPCONTEXT::PROJECTHELPCONTEXT(CVbaFileStreamPtr stream) { load(stream); } PROJECTHELPCONTEXT::~PROJECTHELPCONTEXT() {} BaseRecordPtr PROJECTHELPCONTEXT::clone() { return BaseRecordPtr(new PROJECTHELPCONTEXT(*this)); } void PROJECTHELPCONTEXT::load(CVbaFileStreamPtr stream) { _UINT32 sizeOf; *stream >> sizeOf >> HelpContext; } //------------------------------------------------------------------------------- PROJECTLIBFLAGS::PROJECTLIBFLAGS(CVbaFileStreamPtr stream) { load(stream); } PROJECTLIBFLAGS::~PROJECTLIBFLAGS() {} BaseRecordPtr PROJECTLIBFLAGS::clone() { return BaseRecordPtr(new PROJECTLIBFLAGS(*this)); } void PROJECTLIBFLAGS::load(CVbaFileStreamPtr stream) { _UINT32 sizeOf; *stream >> sizeOf >> ProjectLibFlags; } //------------------------------------------------------------------------------- PROJECTVERSION::PROJECTVERSION(CVbaFileStreamPtr stream) { load(stream); } PROJECTVERSION::~PROJECTVERSION() {} BaseRecordPtr PROJECTVERSION::clone() { return BaseRecordPtr(new PROJECTVERSION(*this)); } void PROJECTVERSION::load(CVbaFileStreamPtr stream) { _UINT32 sizeOf; *stream >> sizeOf >> VersionMajor >> VersionMinor; } //------------------------------------------------------------------------------- //Constants = Constant *(" : " Constant) //Constant = ConstantName " = " ConstantValue //ConstantName = VbaIdentifier //ConstantValue = ["-"] 1 * 5DIGIT PROJECTCONSTANTS::PROJECTCONSTANTS(CVbaFileStreamPtr stream) { load(stream); } PROJECTCONSTANTS::~PROJECTCONSTANTS() {} BaseRecordPtr PROJECTCONSTANTS::clone() { return BaseRecordPtr(new PROJECTCONSTANTS(*this)); } void PROJECTCONSTANTS::load(CVbaFileStreamPtr stream) { unsigned short Reserved; aConstants.load(stream); *stream >> Reserved; uConstants.load(stream); } //------------------------------------------------------------------------------- REFERENCENAME::REFERENCENAME(CVbaFileStreamPtr stream) { load(stream); } REFERENCENAME::~REFERENCENAME() {} BaseRecordPtr REFERENCENAME::clone() { return BaseRecordPtr(new REFERENCENAME(*this)); } void REFERENCENAME::load(CVbaFileStreamPtr stream) { unsigned short Reserved; aName.load(stream); *stream >> Reserved; uName.load(stream); } //------------------------------------------------------------------------------- REFERENCEORIGINAL::REFERENCEORIGINAL(CVbaFileStreamPtr stream) { load(stream); } REFERENCEORIGINAL::~REFERENCEORIGINAL() {} BaseRecordPtr REFERENCEORIGINAL::clone() { return BaseRecordPtr(new REFERENCEORIGINAL(*this)); } void REFERENCEORIGINAL::load(CVbaFileStreamPtr stream) { LibidOriginal.load(stream); } //------------------------------------------------------------------------------- REFERENCEREGISTERED::REFERENCEREGISTERED(CVbaFileStreamPtr stream) { load(stream); } REFERENCEREGISTERED::~REFERENCEREGISTERED() {} BaseRecordPtr REFERENCEREGISTERED::clone() { return BaseRecordPtr(new REFERENCEREGISTERED(*this)); } void REFERENCEREGISTERED::load(CVbaFileStreamPtr stream) { _UINT32 Reserved1, Size; _UINT16 Reserved2; *stream >> Size; Libid.load(stream); *stream >> Reserved1 >> Reserved2; } //------------------------------------------------------------------------------- REFERENCEPROJECT::REFERENCEPROJECT(CVbaFileStreamPtr stream) { load(stream); } REFERENCEPROJECT::~REFERENCEPROJECT() {} BaseRecordPtr REFERENCEPROJECT::clone() { return BaseRecordPtr(new REFERENCEPROJECT(*this)); } void REFERENCEPROJECT::load(CVbaFileStreamPtr stream) { LibidAbsolute.load(stream); LibidRelative.load(stream); *stream >> MajorVersion >> MinorVersion; } //------------------------------------------------------------------------------- REFERENCECONTROL::REFERENCECONTROL(CVbaFileStreamPtr stream) { load(stream); } REFERENCECONTROL::~REFERENCECONTROL() {} BaseRecordPtr REFERENCECONTROL::clone() { return BaseRecordPtr(new REFERENCECONTROL(*this)); } void REFERENCECONTROL::load(CVbaFileStreamPtr stream) { _UINT32 Reserved1, Reserved4, SizeTwiddled, SizeExtended, Cookie; _UINT16 Reserved2, Reserved3, Reserved5, Id; *stream >> SizeTwiddled; LibidTwiddled.load(stream); *stream >> Reserved1 >> Reserved2; *stream >> Id; if (Id == 0x0016) { NameRecordExtended = boost::make_shared(stream); *stream >> Reserved3; } else { Reserved3 = Id; // = 0x0030 } *stream >> SizeExtended; LibidExtended.load(stream); *stream >> Reserved4 >> Reserved5 >> OriginalTypeLib >> Cookie; } //------------------------------------------------------------------------------- PROJECTCOOKIE::PROJECTCOOKIE(CVbaFileStreamPtr stream) { load(stream); } PROJECTCOOKIE::~PROJECTCOOKIE() {} BaseRecordPtr PROJECTCOOKIE::clone() { return BaseRecordPtr(new PROJECTCOOKIE(*this)); } void PROJECTCOOKIE::load(CVbaFileStreamPtr stream) { _UINT16 Id; _UINT32 sizeOf; *stream >> Id >> sizeOf >> Cookie; } //----------------------------------------------------------------------------------- PROJECTMODULES::PROJECTMODULES(CVbaFileStreamPtr stream) { load(stream); } PROJECTMODULES::~PROJECTMODULES() {} BaseRecordPtr PROJECTMODULES::clone() { return BaseRecordPtr(new PROJECTMODULES(*this)); } void PROJECTMODULES::load(CVbaFileStreamPtr stream) { _UINT16 Id, nCount; _UINT32 sizeOf; *stream >> Id >> sizeOf >> nCount; ProjectCookieRecord = PROJECTCOOKIEPtr(new PROJECTCOOKIE(stream)); for (_UINT32 i = 0; i < nCount; i++) { modules.push_back(boost::make_shared(stream)); } } //---------------------------------------------------------------------------------- BaseRecordPtr PROJECTINFORMATION::clone() { return BaseRecordPtr(new PROJECTINFORMATION(*this)); } void PROJECTINFORMATION::load(CVbaFileStreamPtr stream) { while (stream->checkFitRead(6)) { _UINT16 Id; *stream >> Id; if (Id == 0x0016) {//next union stream->RollBack(2); break; } switch (Id) { case rt_PROJECTSYSKIND: { SysKindRecord = boost::make_shared(stream); }break; case rt_PROJECTCODEPAGE: { CodePageRecord = boost::make_shared(stream); }break; case rt_PROJECTCOMPATVERSION: { CompatVersionRecord = boost::make_shared(stream); }break; case rt_PROJECTLCID: { LcidRecord = boost::make_shared(stream); }break; case rt_PROJECTLCIDINVOKE: { LcidInvokeRecord = boost::make_shared(stream); }break; case rt_PROJECTNAME: { NameRecord = boost::make_shared(stream); }break; case rt_PROJECTDOCSTRING: { DocStringRecord = boost::make_shared(stream); }break; case rt_PROJECTHELPFILEPATH: { HelpFilePathRecord = boost::make_shared(stream); }break; case rt_PROJECTHELPCONTEXT: { HelpContextRecord = boost::make_shared(stream); }break; case rt_PROJECTLIBFLAGS: { LibFlagsRecord = boost::make_shared(stream); }break; case rt_PROJECTVERSION: { VersionRecord = boost::make_shared(stream); }break; case rt_PROJECTCONSTANTS: { ConstantsRecord = boost::make_shared(stream); }break; default://unknown .... skip { _UINT32 SizeOf; *stream >> SizeOf; stream->skipBytes(SizeOf); }break; } } } //--------------------------------------------------------------------------------------- BaseRecordPtr PROJECTREFERENCES::clone() { return BaseRecordPtr(new PROJECTREFERENCES(*this)); } void PROJECTREFERENCES::load(CVbaFileStreamPtr stream) { while (stream->checkFitRead(6)) { _UINT16 Id; *stream >> Id; if (Id == rt_REFERENCENAME) { stream->RollBack(2); ReferenceArray.push_back(boost::make_shared(stream)); } else if (Id == rt_PROJECTMODULES) {//next union stream->RollBack(2); break; } else { _UINT32 SizeOf; *stream >> SizeOf; stream->skipBytes(SizeOf); } } } //--------------------------------------------------------------------------------------- BaseRecordPtr REFERENCE::clone() { return BaseRecordPtr(new REFERENCE(*this)); } void REFERENCE::load(CVbaFileStreamPtr stream) { while (stream->checkFitRead(6)) { _UINT16 Id; *stream >> Id; if (Id == rt_PROJECTMODULES || (NameRecord && Id == rt_REFERENCENAME)) {//next union stream->RollBack(2); break; } switch (Id) { case rt_REFERENCENAME: NameRecord = boost::make_shared(stream); break; case rt_REFERENCEORIGINAL: ReferenceRecord = boost::make_shared(stream); break; case rt_REFERENCECONTROL: ReferenceRecord = boost::make_shared(stream); break; case rt_REFERENCEREGISTERED: ReferenceRecord = boost::make_shared(stream); break; case rt_REFERENCEPROJECT: ReferenceRecord = boost::make_shared(stream); break; default://unknown .... skip { _UINT32 SizeOf; *stream >> SizeOf; stream->skipBytes(SizeOf); }break; } } } //--------------------------------------------------------------------------------------- //------------------------------------------------------------------------------- //PROJECTMODULES::PROJECTMODULES() {} //PROJECTMODULES::~PROJECTMODULES() {} //BaseObjectPtr PROJECTMODULES::clone() //{ // return BaseObjectPtr(new PROJECTMODULES(*this)); //} //const bool PROJECTMODULES::loadContent(BinProcessor& proc) //{ // BiffAttributeSimple nCount; // proc.nCount; // if (proc.optional()) // { // ProjectCookieRecord = boost::make_shared<>(stream); // elements_.pop_back(); // } // for (unsigned short i = 0; i < nCount; i++) // { // MODULE *m = new MODULE(); // m->loadContent(proc); // modules.push_back(BaseObjectPtr(m)); // } //} } // namespace VBA