用vs2012 x86编译的Qt5.1.1,assistant无法启动问题

用vs2012 x86编译的Qt5.1.1,assistant无法启动

错误提示如下:



上网找了一下解决办法:

见http://www.hnmade.com/bbs/thread-11011-1-1.html


被这种莫名其妙的问题卡住,很不爽,索性编了一套带调试信息的Release版,调试后,发现问题是出在文件TextEncodingRegistry.cpp中(Qt5Webkit模块):
PassOwnPtr<TextCodec> newTextCodec(const TextEncoding& encoding)
{
    MutexLocker lock(encodingRegistryMutex());

    ASSERT(textCodecMap);
    TextCodecFactory factory = textCodecMap->get(encoding.name());
    ASSERT(factory.function);
    return factory.function(encoding, factory.additionalData);
}
上面那行红色的代码,encoding.name()的值是"ISO-8859-1",返回的factory却是空的,导致后面调用它的成员函数function时直接Access Violation。

在网上查了一下,发现这个问题早在Qt 4.8.2时就已经存在了,同样的工具链(vs2012 x86),同样的异常代码:
https://bugs.webkit.org/show_bug.cgi?id=90008
好像是HashMap的成员函数get的问题,还没有细查,依照上述链接中的解决方案修改就好了:

将函数:
static void addToTextCodecMap(const char* name, NewTextCodecFunction function, const void* additionalData)
{
    const char* atomicName = textEncodingNameMap->get(name);
    ASSERT(atomicName);
    textCodecMap->add(atomicName, TextCodecFactory(function, additionalData));
}
修改为:
static void addToTextCodecMap(const char* name, NewTextCodecFunction function, const void* additionalData)
{
    // const char* atomicName = textEncodingNameMap->get(name);
    const char* atomicName;
    TextEncodingNameMap::iterator pos;
    for (pos = textEncodingNameMap->begin(); pos != textEncodingNameMap->end(); ++pos) {
        if (strcmp(pos->key, name) == 0) {
            atomicName = pos->value;
            break;
        }
    }
    ASSERT(atomicName);
    textCodecMap->add(atomicName, TextCodecFactory(function, additionalData));
}

将函数:
PassOwnPtr<TextCodec> newTextCodec(const TextEncoding& encoding)
{
    MutexLocker lock(encodingRegistryMutex());
    ASSERT(textCodecMap);
    TextCodecFactory factory = textCodecMap->get(encoding.name());
    ASSERT(factory.function);
    return factory.function(encoding, factory.additionalData);
}
修改为:
PassOwnPtr<TextCodec> newTextCodec(const TextEncoding& encoding)
{
    MutexLocker lock(encodingRegistryMutex());
    ASSERT(textCodecMap);
    // TextCodecFactory factory = textCodecMap->get(encoding.name());
    TextCodecFactory factory;
    TextCodecMap::iterator pos;
    for (pos = textCodecMap->begin(); pos != textCodecMap->end(); ++pos) {
        if (strcmp(pos->key, encoding.name()) == 0) {
            factory = pos->value;
            break;
        }
    }
    ASSERT(factory.function);
    return factory.function(encoding, factory.additionalData);
}

注:Qt5Webkit的KeyValuePair的键/值使用的是key/value,不是原来的first/second。



看来还是要编译webkit

你可能感兴趣的:(用vs2012 x86编译的Qt5.1.1,assistant无法启动问题)