调用UpdateResource来替换资源会丢弃RT_STRING资源

时间:2015-01-13 12:11:16

标签: c++ c windows winapi resources

我正在尝试更新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资源。

我呼叫BeginUpdateResourcebDeleteExistingResources设置为FALSEUpdateResource使用正确的wLanguage参数(语言中立)和EndUpdateResource调用时fDiscard参数设置为FALSE

为什么RT_STRING资源会丢失,以及如何防止这种情况发生?

0 个答案:

没有答案