用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值