Visual Studio 2015 для Visual Studio 6 Совместимость кода
На Windows Server 2012 я установил Visual Studio 2015. Теперь мне нужно построить рабочий проект на основе Visual Studio C++ 6 в VC++ 2015, но он показывает различные ошибки и предупреждения, такие как:
1>------ Build started: Project: Exewrap, Configuration: Debug Win32
------ 1> Pewrap.cpp 1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\afx.h(38): warning C4996: 'MBCS_Support_Deprecated_In_MFC': MBCS support in MFC is deprecated and may be removed in a future version of MFC. 1> C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\afx.h(33): note: see declaration of 'MBCS_Support_Deprecated_In_MFC' 1> _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h) 1>c:\muazzam\exewrap\Pe.h(17): warning C4200: nonstandard extension used: zero-sized array in struct/union 1> c:\muazzam\exewrap\Pe.h(17): note: Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array 1>Pewrap.cpp(291): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(205): note: see declaration of 'fopen' 1>Pewrap.cpp(517): error C2065: 'i': undeclared identifier 1>Pewrap.cpp(546): error C2065: 'i': undeclared identifier 1>Pewrap.cpp(551): error C2065: 'i': undeclared identifier 1>Pewrap.cpp(361): warning C4996: 'stricmp': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name:
_stricmp. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(568): note: see declaration of 'stricmp' 1>Pewrap.cpp(362): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use
_CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(346): note: see declaration of 'strncpy' 1>Pewrap.cpp(364): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use
_CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(346): note: see declaration of 'strncpy' 1>Pewrap.cpp(365): warning C4996: 'stricmp': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _stricmp. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(568): note: see declaration of 'stricmp' 1>Pewrap.cpp(366): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(346): note: see declaration of 'strncpy' 1>Pewrap.cpp(368): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(346): note: see declaration of 'strncpy' 1>Pewrap.cpp(369): warning C4996: 'stricmp': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _stricmp. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(568): note: see declaration of 'stricmp' 1>Pewrap.cpp(370): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use
_CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(346): note: see declaration of 'strncpy' 1>Pewrap.cpp(372): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use
_CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(346): note: see declaration of 'strncpy' 1>Pewrap.cpp(403): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(119): note: see declaration of 'strcpy' 1>Pewrap.cpp(409): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(346): note: see declaration of 'strncpy' 1>Pewrap.cpp(410): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(346): note: see declaration of 'strncpy' 1>Pewrap.cpp(411): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(346): note: see declaration of 'strncpy' 1>Pewrap.cpp(412): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(346): note: see declaration of 'strncpy' 1>Pewrap.cpp(480): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(119): note: see declaration of 'strcpy' 1>Pewrap.cpp(494): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(119): note: see declaration of 'strcpy' 1>Pewrap.cpp(566): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(205): note: see declaration of 'fopen'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Я не видел никакой опции в диспетчере конфигурации для VC++6.
Я думаю, что могут быть некоторые другие параметры конфигурации, но я не знаю много об этом. Дайте мне знать, если кто-нибудь может помочь в этом.
Кроме того, мне необходимо повторно использовать код и создавать приложения с использованием межплатформенной IDE VS Studio 2015 для телефонов Android и IOS.
Итак, как обновить код VC++ 6, который должен быть совместим с последней версией VC++. Между тем это показывает:
Visual Studio 2012 и Visual Studio 2013 не поддерживают приложения для отладки, созданные с помощью Visual C++ 6; для отладки этих приложений используйте более ранние версии Visual Studio.
Должен ли я сначала обновить проект с VC++6 -> VC++2010, а затем собрать проекты с более старыми версиями или есть прямой метод?
Обновление: код, где появляются ошибки:
bool Pewrap::Process(PPROTECTIONDETAIL pDetail)
{
LPVOID pPosition = NULL;
LPVOID pImportBegin = NULL;
DWORD dPosition = 0;
DWORD dImportRva = 0;
USERDATA SavedInfo;
PIMAGE_IMPORT_DESCRIPTOR pImportDesc;
PIMAGE_IMPORT_BY_NAME pImpByName;
DWORD * ThunkPtr;
PSIZEINFO pSize=NULL;
PROTECTEDINFO ProtInfo;
memset(&SavedInfo,0,sizeof(USERDATA));
pResBase = 0;
if(Loaded == true)
{
CloseFile();
}
if(Loaded == false)
{
if(LoadFile(EXTRASIZE)==false)
{
return false;
}
}
if(pDetail->ProtType == PROTECTION_STRONG)
{
UseVGCrypt = 1;
SavedInfo.ProtType = PROTECTION_STRONG;
}
else
{
UseVGCrypt = 0;
SavedInfo.ProtType = PROTECTION_MEDIUM;
}
unsigned char ProdId[PROD_ID_LEN];
memset(ProdId,0,sizeof(ProdId));
if(GetProtectedInfo(pDetail->Destination,&ProtInfo)==false)
{
GenRsaPrime((DIGIT_T*)ProdId,MOD_SIZE);
ProdId[0]= ProdId[0] & RSA_MESSAGE_HIGHBIT_MASK; // needed for rsa algorithm.
}
else
{
memcpy(ProdId,ProtInfo.prodid,PROD_ID_LEN);
if(stricmp(pDetail->Author,"None")==0)
strncpy(pDetail->Author,ProtInfo.Author,sizeof(pDetail->Author));
else
strncpy(ProtInfo.Author,pDetail->Author,sizeof(ProtInfo.Author));
if(stricmp(pDetail->Title,"None")==0)
strncpy(pDetail->Title,ProtInfo.Title,sizeof(pDetail->Title));
else
strncpy(ProtInfo.Title,pDetail->Title,sizeof(ProtInfo.Title));
if(stricmp(pDetail->PubDate,"None")==0)
strncpy(pDetail->PubDate,ProtInfo.PublishDate,sizeof(pDetail->PubDate));
else
strncpy(ProtInfo.PublishDate,pDetail->PubDate,sizeof(ProtInfo.PublishDate));
}
SetProtectedInfo(&ProtInfo,pDetail,ProdId);
// GenRsaPrime((DIGIT_T*)ProdId,MOD_SIZE);
// ProdId[0]= ProdId[0] & RSA_MESSAGE_HIGHBIT_MASK; // needed for rsa algorithm.
memcpy(Key,ProdId,PROD_ID_LEN);
if(pDetail->TestMode == FALSE)
{
RSACTX pubctx,prictx;
SavedInfo.TestMode = 0;
GetRsaCtx(&pubctx,(char*)pubcrykey,0);
RsaCrypt(&pubctx,(char*)ProdId,sizeof(ProdId));
memcpy(SavedInfo.ProductId,ProdId,PROD_ID_LEN);
}
else
{
SavedInfo.TestMode = 1;
memcpy(SavedInfo.ProductId,ProdId,PROD_ID_LEN);
}
memset(pDetail->ProdId,0,sizeof(pDetail->ProdId));
if(pDetail->TestMode == TRUE)
{
strcpy(pDetail->ProdId,"None");
}
else
{
BinToHex((char*)SavedInfo.ProductId,PROD_ID_LEN,pDetail->ProdId);
}
strncpy(SavedInfo.Author,pDetail->Author,sizeof(SavedInfo.Author)-1);
strncpy(SavedInfo.Title,pDetail->Title,sizeof(SavedInfo.Title)-1);
strncpy(SavedInfo.PublishDate,pDetail->PubDate,sizeof(SavedInfo.PublishDate)-1);
strncpy(SavedInfo.RegUrl,pDetail->RegUrl,sizeof(SavedInfo.RegUrl)-1);
if(pDetail->FreeWare == TRUE)
{
SavedInfo.FreeWare = 1;
}
else
{
SavedInfo.FreeWare = 0;
}
if(UseVGCrypt)
{
VGInit(&ctx,Key,KEYLEN);
}
PIMAGE_SECTION_HEADER pSecHdr = GetLastSection();
DWORD align=pImage->OptionalHeader.SectionAlignment;
if(Length < (pSecHdr->PointerToRawData+pSecHdr->SizeOfRawData))
{
AfxMessageBox("Actual File Length is less than What is said in Header.\n"
"The File Might be corrupt.");
return false;
}
if(Length > (pSecHdr->PointerToRawData+pSecHdr->SizeOfRawData))
{
DWORD Size = Length - (pSecHdr->PointerToRawData+pSecHdr->SizeOfRawData);
if(pSecHdr->Misc.VirtualSize < (pSecHdr->SizeOfRawData+Size))
{
pSecHdr->Misc.VirtualSize=pSecHdr->SizeOfRawData+Size;
pSecHdr->Misc.VirtualSize= ((pSecHdr->Misc.VirtualSize / align) * align) + align;
pImage->OptionalHeader.SizeOfImage=pSecHdr->VirtualAddress+pSecHdr->Misc.VirtualSize;
}
pSecHdr->SizeOfRawData += Size;
}
pPosition = GetWritePointer();
if(pPosition == NULL)
return false;
dPosition = pSecHdr->VirtualAddress + pSecHdr->SizeOfRawData;
memcpy((char*)pPosition,asmStub,sizeof(asmStub));
pPosition = ADDPTR(LPVOID,pPosition,sizeof(asmStub));
pSize = (PSIZEINFO)pPosition;
pPosition = ADDPTR(LPVOID,pPosition,sizeof(SIZEINFO));
dPosition += sizeof(asmStub)+sizeof(SIZEINFO);
pImportBegin = pPosition;
IMAGE_DATA_DIRECTORY NullDirectory = { 0,0 };
SavedInfo.ImportDataDirectory = pImage->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
SavedInfo.TlsDataDirectory = pImage->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS];
SavedInfo.BoundImportDirectory = pImage->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT];
pImage->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS] = NullDirectory;
pImage->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT] = NullDirectory;
pImportDesc =(PIMAGE_IMPORT_DESCRIPTOR) pPosition;
pImportDesc->ForwarderChain = 0;
pImportDesc->TimeDateStamp = 0;
dPosition+= sizeof(IMAGE_IMPORT_DESCRIPTOR)*2;
pImportDesc->Name = dPosition ;
pPosition = ADDPTR(LPVOID,pPosition,(sizeof(IMAGE_IMPORT_DESCRIPTOR) *2));
strcpy((char*)pPosition,KERNEL32);
pPosition = ADDPTR(LPVOID,pPosition,sizeof(KERNEL32));
dPosition+=sizeof(KERNEL32);
pImportDesc->FirstThunk = dPosition;
ThunkPtr = (DWORD*) pPosition;
pPosition = ADDPTR(LPVOID,pPosition,(NO_OF_FUNCTIONS +1)* sizeof(IMAGE_THUNK_DATA));
dPosition += ((NO_OF_FUNCTIONS +1)* sizeof(IMAGE_THUNK_DATA));
for(int i=0;i<NO_OF_FUNCTIONS;i++)
{
pImpByName = (PIMAGE_IMPORT_BY_NAME)pPosition;
pImpByName->Hint=0;
strcpy((char*)pImpByName->Name,FunctionArray[i]);
*ThunkPtr = dPosition;
ThunkPtr++;
pPosition = ADDPTR(LPVOID,pPosition,(sizeof(WORD) + strlen(FunctionArray[i])+1));
dPosition += (sizeof(WORD) + strlen(FunctionArray[i])+1);
}
*ThunkPtr = 0;
pImportDesc++;
memset(pImportDesc,0,sizeof(IMAGE_IMPORT_DESCRIPTOR));
dImportRva = pSecHdr->VirtualAddress + pSecHdr->SizeOfRawData + SUBPTR(DWORD,pImportBegin,GetWritePointer());
DWORD ImportSize = SUBPTR(DWORD,pPosition,pImportBegin);
pImage->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = ImportSize;
pImage->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = dImportRva;
SavedInfo.OriginalEntryPoint = pImage->OptionalHeader.AddressOfEntryPoint;
pImage->OptionalHeader.AddressOfEntryPoint = pSecHdr->VirtualAddress + pSecHdr->SizeOfRawData;
PIMAGE_SECTION_HEADER pSecHdrTmp;
pSecHdrTmp = pImage->SectionHeader;
for(i=0;i<pImage->FileHeader.NumberOfSections;i++)
{
pSecHdrTmp->Characteristics = 0xe0000060;
pSecHdrTmp++;
}
DWORD IncreasedSize = SUBPTR(DWORD,pPosition,GetWritePointer());
DWORD ExtendedMapSize = IncreasedSize;
pSize->ImportDataSize = ImportSize;
pSize->UserDataSize = sizeof(USERDATA);
pSize->DllDataSize = sizeof(rawData);
IncreasedSize+= pSize->UserDataSize;
IncreasedSize+= pSize->DllDataSize;
IncreasedSize+= sizeof(PROTECTEDINFO);
if(pSecHdr->Misc.VirtualSize < (pSecHdr->SizeOfRawData+IncreasedSize))
{
pSecHdr->Misc.VirtualSize=pSecHdr->SizeOfRawData+IncreasedSize;
pSecHdr->Misc.VirtualSize= ((pSecHdr->Misc.VirtualSize / align) * align) + align;
pImage->OptionalHeader.SizeOfImage=pSecHdr->VirtualAddress+pSecHdr->Misc.VirtualSize;
}
pSecHdr->SizeOfRawData += IncreasedSize;
PIMAGE_SECTION_HEADER pEncSecHdr = pImage->SectionHeader;
for(i=0;i<pImage->FileHeader.NumberOfSections;i++)
{
if(CanEncryptSection(pEncSecHdr))
{
EncryptSection(pEncSecHdr);
SavedInfo.EncryptedSections = SavedInfo.EncryptedSections | (0x80000000 >> i);
}
pEncSecHdr++;
}
if(CanEncryptResourceSection())
{
EncryptResourceSection();
SavedInfo.ResourceEncrypted = RESOURCE_IS_INCRYPTED;
}
// DWORD temp = MapSize;
// MapSize = Length + IncreasedSize;
// SaveCopy("out.exe");
FILE * f=fopen((LPCTSTR)pDetail->Destination,"wb");
if(f==NULL)
{
CString msg;
msg.Format("Could not open %s for output",pDetail->Destination);
AfxMessageBox(msg);
return false;
}
fwrite((char*)pBase,Length+ExtendedMapSize,1,f);
DWORD Temp = UseVGCrypt = 0;
memcpy(Key,GlobalKey,KEYLEN);
EncryptData(&SavedInfo,sizeof(USERDATA));
UseVGCrypt = Temp;
fwrite((char*)&SavedInfo,sizeof(USERDATA),1,f);
unsigned char * rd = new unsigned char[sizeof(rawData)];
memcpy(rd,rawData,sizeof(rawData));
CryptRawData(rd,sizeof(rawData));
fwrite(rd,sizeof(rawData),1,f);
delete rd;
fwrite(&ProtInfo,sizeof(ProtInfo),1,f);
fclose(f);
return true;
}
3 ответа
_CRT_SECURE_NO_WARNINGS
это всего лишь предупреждения - ваш код все равно будет компилироваться (и быть не менее безопасным, чем он был скомпилирован в VC++6). Единственные ошибки, которые у вас есть (из вашего вывода), имеют вид:
Pewrap.cpp(551): error C2065: 'i': undeclared identifier
Я собираюсь предположить, что 'i' является индексной переменной цикла for, и что ваш проект VC++ 6 использовал расширения языка Microsoft, так что объявления переменных цикла сохранялись после цикла. Я также собираюсь предположить, что в вашем проекте VS2015, Disable Language Extensions /Za (Property Pages->C/C++->Language) включен, таким образом, первый цикл, где используется "i", работает, а остальные дают ошибки. Либо не отключайте языковые расширения, либо объявляйте 'i' в каждом цикле, в котором вы его используете (или в более широком контексте).
Правильное объявление "i" - самый переносимый метод, поскольку он не зависит от каких-либо языковых расширений. Например. у вас есть это:
for(int i=0;i<NO_OF_FUNCTIONS;i++)
...
for(i=0;i<pImage->FileHeader.NumberOfSections;i++)
...
Изменение первого использования "я" на просто:
int i;
for(i=0;i<NO_OF_FUNCTIONS;i++)
Выберите проект в обозревателе решений, щелкните правой кнопкой мыши - Свойства. C/C++ > Препроцессор.
Повторите этот шаг для всех конфигураций / всех платформ, изменив конфигурацию (Debug / Release) / platform (x86 / x64) из верхних выпадающих списков и сохранив конфигурацию для каждой конфигурации / платформы.
Редактировать определения препроцессора. Добавьте следующее определение "_CRT_SECURE_NO_WARNINGS" - это отключит предупреждение о совместимости функций.
Единственные сообщения, которые вы показываете - это безобидные предупреждения. Вопреки одному из ваших комментариев, они исчезают, когда вы определяете _CRT_SECURE_NO_WARNINGS
, Если нет, вы не определили символ правильно или для правильных файлов.
Я вижу упоминание о 'i': undeclared identifier
ошибка в другом посте, но не в вашем резюме. Если возникает последнее, то это действительно изменение в правилах определения объёмов объявлений внутри цикла, которые управляются с помощью параметра /Zc (C++ / Language / Force Conformance в For Loop Scope).