我正在尝试更新DLL文件中的资源。有问题的DLL文件包含RT_VERSION
(16)资源,多个RT_STRING
(6)以及许多自定义资源类型的资源。我使用以下方法替换单个资源:
bool ReplaceResource( LPCTSTR a_ResourceFile,
LPCTSTR a_ResourceType, LPCTSTR a_ResourceName,
LPCTSTR a_SourceFile )
{
// Open DLL file for editing
HANDLE hResFile = BeginUpdateResource( a_ResourceFile,
FALSE );// Don't delete existing resources
if ( hResFile == NULL )
return false;
// Read in new resource file
HANDLE hSrcFile = CreateFile( a_SourceFile, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0x0, NULL );
if ( hSrcFile == INVALID_HANDLE_VALUE ) {
EndUpdateResource( hResFile, TRUE );
return false;
}
DWORD dwFileSizeLow = GetFileSize( hSrcFile, NULL );
std::vector<unsigned char> buffer( static_cast<size_t>( dwFileSizeLow ) );
DWORD dwBytesRead = 0x0;
if ( !ReadFile( hSrcFile, buffer.data(), static_cast<DWORD>( buffer.size() ),
&dwBytesRead, NULL ) ||
( dwBytesRead != static_cast<DWORD>( buffer.size() ) ) ) {
CloseHandle( hSrcFile );
EndUpdateResource( hResFile, TRUE );
return false;
}
CloseHandle( hSrcFile );
// Replace resource
if ( !UpdateResource( hResFile, a_ResourceType, a_ResourceName,
MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL ),
buffer.data(), static_cast<DWORD>( buffer.size() ) ) ) {
EndUpdateResource( hResFile, TRUE );
return false;
}
EndUpdateResource( hResFile,
FALSE ); // Don't discard changes
return true;
}
预期结果是此方法替换单个资源并保留所有剩余资源不变。但是,将它与特定的DLL文件一起使用,除了替换其中一个自定义资源外,它还会丢弃所有RT_STRING
资源。
我呼叫BeginUpdateResource,bDeleteExistingResources
设置为FALSE
,UpdateResource使用正确的wLanguage
参数(语言中立)和EndUpdateResource调用时fDiscard
参数设置为FALSE
。
为什么RT_STRING
资源会丢失,以及如何防止这种情况发生?