小编Jeh*_*joa的帖子

PostMessage()成功但我的消息处理代码从未收到消息

在我的C++应用程序的GUI对象中,我在主窗口过程中有以下内容:

case WM_SIZE:
    {
        OutputDebugString(L"WM_SIZE received.\n");
        RECT rect = {0};
        GetWindowRect(hwnd, &rect);
        if (!PostMessage(0, GUI_MSG_SIZECHANGED, w, MAKELONG(rect.bottom - rect.top, rect.right - rect.left))) {
            OutputDebugString(L"PostMessage failed.\n"); // <--- never called
        }
    }

    return 0; // break;
Run Code Online (Sandbox Code Playgroud)

GUI对象还具有以下getMessage()方法:

int GUI::getMessage(MSG & msg) {
    BOOL result = 0;

    while ((result = GetMessage(&msg, 0, 0, 0)) > 0) {
        if (msg.message > (GUI_MSG_BASE-1) && msg.message < (GUI_MSG_LAST+1)) {
            OutputDebugString(L"GUI message received.\n");
            break;
        }
        else {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

应用程序对象以下列方式调用此方法:

while …
Run Code Online (Sandbox Code Playgroud)

c++ user-interface winapi postmessage

9
推荐指数
1
解决办法
1935
查看次数

Libcurl停止工作,SSL连接错误

我正在制作个人使用的程序,定期擦除几个网页.其中一个需要使用SSL,其主URL实际上是一个负载均衡器,每次重定向到一个不同的域,从少数列表中(不确定这是否相关).我对libcurl和SSL很新,所以我可能会遗漏一些明显但我不这么认为的东西.

该程序运行良好一段时间(到目前为止,从不超过一个小时),但一旦它第一次得到SSL连接错误,它将每次都给出相同的错误.在开始失败之前,它总是一个不同的时间量和不同数量的成功请求.

错误缓冲区始终包含以下内容: schannel: next InitializeSecurityContext failed: SEC_E_ILLEGAL_MESSAGE (0x80090326) - This error usually occurs when a fatal SSL/TLS alert is received (e.g. handshake failed). More detail may be available in the Windows System event log.

没有什么用处eventvwr.对该错误代码的搜索会返回有关早期版本的Windows Server上的自签名证书问题的结果,但很少有其他问题.我不控制我正在连接的服务器,但我怀疑它是一个Windows框.

我在这里已经没有想法,所以我只是要提供任何可能相关的细节.我不能真正发布任何实际的源代码,因为我已经在几个类中抽象了所有的curl调用,所以我必须粘贴很多样板代码才能让别人理解它.我已经使用Visual Studio调试器确认这是实际调用的结果.

在创建任何其他线程之前,我在主线程中初始化libcurl,如下所示: curl_global_init(CURL_GLOBAL_WIN32 | CURL_GLOBAL_SSL);

然后我在第二个线程中创建并初始化实际的curl句柄,并且仅在该线程中,如下所示:

m_handle = curl_easy_init();
curl_easy_setopt(m_handle, CURLOPT_WRITEDATA, this);
curl_easy_setopt(m_handle, CURLOPT_WRITEFUNCTION, write);
curl_easy_setopt(m_handle, CURLOPT_DEBUGDATA, this);
curl_easy_setopt(m_handle, CURLOPT_DEBUGFUNCTION, debug);
curl_easy_setopt(m_handle, CURLOPT_VERBOSE, 1);
curl_easy_setopt(m_handle, CURLOPT_ERRORBUFFER, &m_errormsg[0]);
curl_easy_setopt(m_handle, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(m_handle, CURLOPT_COOKIEFILE, "");
Run Code Online (Sandbox Code Playgroud)

我已经尝试过同时设置CURLOPT_SSL_VERIFYHOSTCURLOPT_SSL_VERIFYPEER为0,但是这并没有帮助.

我内置的libcurl从curl-7.43.0.tar.gz …

c++ ssl winapi schannel libcurl

7
推荐指数
1
解决办法
1485
查看次数

使用CMake将Qt DLL复制到Windows上的可执行目录

CMake的新手,我很难理解如何使用生成器表达式.我正在尝试使用add_custom_command创建后生成命令将Qt DLL复制到可执行目录.

Qt5WidgetsConfig.cmake我可以看到它创建QT5 ::小工具的目标不同的属性来引用的DLL,这取决于当前活动的配置.无论是IMPORTED_LOCATION_DEBUGIMPORTED_LOCATION_RELEASE.我希望能够将$<CONFIG:Debug>生成器表达式用作一个条件if()但不起作用.

我的CMakeLists.txt:

# minimum version required for proper support of C++11 features in Qt
cmake_minimum_required(VERSION 3.1.0)

set(CMAKE_CONFIGURATION_TYPES Debug;Release)

# project name and version
project(TPBMon VERSION 0.0.0.1)

# Qt5 libs
find_package(Qt5Widgets REQUIRED)

# run Qt's MOC when needed
set(CMAKE_AUTOMOC ON)

add_executable(
    tpbmon
    src/main.cpp
    src/mainwindow.hpp
    src/mainwindow.cpp
)
target_link_libraries(tpbmon Qt5::Widgets)
set_target_properties(
    tpbmon
    PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin
)
if(WIN32)
    if($<CONFIG:Debug>)
        get_target_property(WIDGETDLL Qt5::Widgets IMPORTED_LOCATION_DEBUG)
    else($<CONFIG:Debug>)
        get_target_property(WIDGETDLL Qt5::Widgets IMPORTED_LOCATION_RELEASE)
    endif($<CONFIG:Debug>)
    add_custom_command(
        TARGET …
Run Code Online (Sandbox Code Playgroud)

windows cmake qt5

3
推荐指数
2
解决办法
2625
查看次数

从32位进程打开%SystemRoot%\ system32\calc.exe重定向到另一个文件.哪个,为什么以及如何?

我目前正在用C++编写一些测试代码,这些代码使用PE文件来理解它的文件格式结构.我的项目设置为64位编译.在我的代码中,我打开%SystemRoot%\ system32\calc.exe并读取IMAGE_DOS_HEADER和IMAGE_NT_HEADERS结构.同时我使用十六进制编辑器插件在Notepad ++中打开了相同的calc.exe.我将我的代码读取的值与Notepad ++进行了比较,发现它们不同.我将calc.exe从System32复制到C:\ Temp\calc.exe,现在值匹配.

Notepad ++似乎是一个32位应用程序(尚未检查PE文件,但由于它默认安装到Program Files(x86),所以它似乎是一个安全的假设).

这个WinSxS在起作用吗?或者还有什么导致这个?哪个文件实际上被送到32位应用程序打开%SystemRoot%\ system32\calc.exe?

只是好奇.在此先感谢任何光线.

winapi winsxs wow64 createfile windows-7-x64

2
推荐指数
1
解决办法
2097
查看次数