首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cppwinrt例子中的神秘碰撞

cppwinrt例子中的神秘碰撞
EN

Stack Overflow用户
提问于 2017-05-13 00:10:08
回答 1查看 344关注 0票数 0

我正在使用Visual 17 v15.0和赢得10周年更新SDK。

我使用cl /EHsc /O2 /DUNICODE /bigobj /await /std:c++latest/MTMD构建了以下代码(基本上是/MT)。它没有错误地编译。

如果在当前目录中“message.png”不存在时运行,则会抛出异常,并使用printf捕获并报告异常,然后退出而不会崩溃。

如果我在当前目录中运行“message.png”是时,"Hello!“会被打印出来,然后无缘无故地崩溃。

奇怪的是,如果我在GDB调试器中运行它,GDB总是说程序正常退出(确实不会发生崩溃)。

GDB产出:

代码语言:javascript
复制
[New Thread 1364.0x2324]
[New Thread 1364.0x624]
[New Thread 1364.0x12cc]
[New Thread 1364.0x58c]
[New Thread 1364.0x1134]
[New Thread 1364.0x10d8]
[New Thread 1364.0x18a8]
[New Thread 1364.0x1794]
[New Thread 1364.0x20e8]
[New Thread 1364.0x2204]
[New Thread 1364.0x1030]
[New Thread 1364.0x1474]
Hello world!
[Thread 1364.0x10d8 exited with code 0]
[Thread 1364.0x624 exited with code 0]
[Thread 1364.0x20e8 exited with code 0]
[Thread 1364.0x1794 exited with code 0]
[Thread 1364.0x18a8 exited with code 0]
[Thread 1364.0x58c exited with code 0]
[Thread 1364.0x1134 exited with code 0]
[Thread 1364.0x12cc exited with code 0]
[Thread 1364.0x8d0 exited with code 0]
[Thread 1364.0x2324 exited with code 0]
[Thread 1364.0x1b38 exited with code 0]
[Thread 1364.0x2204 exited with code 0]
[Thread 1364.0x1030 exited with code 0]
[Thread 1364.0x1474 exited with code 0]
[Inferior 1 (process 1364) exited normally]

代码:

代码语言:javascript
复制
#pragma comment(lib, "windowsapp") 
#pragma comment(lib, "pathcch")

#include <winrt/Windows.Storage.Streams.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Media.Ocr.h>
#include <winrt/Windows.Networking.Sockets.h>

#include <pathcch.h>

using namespace winrt;
using namespace std::chrono;

using namespace Windows::Foundation;
using namespace Windows::Storage;
using namespace Windows::Storage::Streams;
using namespace Windows::Graphics::Imaging;
using namespace Windows::Media::Ocr;

hstring MessagePath()
{
    wchar_t buffer[1024]{};
    GetCurrentDirectory(_countof(buffer), buffer);
    check_hresult(PathCchAppendEx(buffer, _countof(buffer), L"message.png", PATHCCH_ALLOW_LONG_PATHS));
    return buffer;
}

IAsyncOperation<hstring> AsyncSample()
{
    StorageFile file = co_await StorageFile::GetFileFromPathAsync(MessagePath());
    IRandomAccessStream stream = co_await file.OpenAsync(FileAccessMode::Read);

    BitmapDecoder decoder = co_await BitmapDecoder::CreateAsync(stream);
    SoftwareBitmap bitmap = co_await decoder.GetSoftwareBitmapAsync();

    OcrEngine engine = OcrEngine::TryCreateFromUserProfileLanguages();
    OcrResult result = co_await engine.RecognizeAsync(bitmap);
    return result.Text();
}

int main()
{
    init_apartment();

    try
    {
        printf("%ls\n", AsyncSample().get().c_str());
    }
    catch (hresult_error const & e)
    {
        printf("hresult_error: (0x%8X) %ls\n", e.code(), e.message().c_str());
    }

    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2017-05-13 03:15:41

原来由hstring返回的AsyncSample().get()不是null终止,所以printf崩溃了。

代码语言:javascript
复制
try
{
    auto ans = AsyncSample().get();
    printf("[%u]: ", ans.size());
    auto s = ans.c_str();
    for (uint32_t i = 0; i < ans.size(); i++) {
        printf("%lc", s[i]);
    }
    putchar('\n');
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43947981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档