小编Sah*_*ngh的帖子

#error WINDOWS.H已经包含在内.MFC应用程序不得#include <windows.h>

我正在收到#error WINDOWS.H.MFC应用程序不能#include windows.h但我不知道如何找出因为这个文件正在发生

谢谢

c++ windows mfc

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

如何使用socat代理拦截Unix域套接字发送辅助数据?

我有两个程序,一个服务器和一个客户端.服务器打开文件,向其写入数据,然后通过unix域套接字将其文件描述符发送到客户端.一切正常,直到我介绍一个socat代理.

socat -x -v UNIX-LISTEN:/tmp/unixSockSendFe,mode=775,reuseaddr,fork UNIX-CONNECT:/tmp/unixSockSendFd 
Run Code Online (Sandbox Code Playgroud)

说明
服务器侦听/tmp/unixSockSendFd,socat连接到它(UNIX-CONNECT:/tmp/unixSockSendFd),并创建UNIX-LISTEN:/tmp/unixSockSendFe,mode=775,reuseaddr,fork客户端连接的另一个Unix域套接字().客户端和服务器之间的任何通信都通过中继socat,打印以二进制(-x选项)和ascii(-v选项)形式发送的字节.

如果我不使用socat,并且客户端直接连接到服务器(在 /tmp/unixSockSendFd套接字上),一切正常,但当socat用作代理时,客户端崩溃时出现分段错误.

服务器

/*Server code - sendfd.c*/
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>

char *socket_path = "/tmp/unixSockSendFd";
char *file="/tmp/abcd.txt" ;/*file whose fd is to be sent*/
int sendfd(int sock, int fd);
int recvfd(int s);
char data[]="sahil\0";

int main(int argc, char *argv[]) {
  struct sockaddr_un addr;
  char buf[100]; …
Run Code Online (Sandbox Code Playgroud)

sockets linux proxy socat unix-socket

7
推荐指数
0
解决办法
862
查看次数

如何从处于低功耗状态的 USB 设备获取字符串描述符?

我正在尝试用 C++ 编写一个应用程序,其中列出从 USB 设备获取的信息。我正在关注 USBView ( Github ) 实用程序的代码。

当设备处于D0电源状态(完全供电)时,我能够获取字符串描述符,但是当设备进入低功耗状态时(D2),我无法获取字符串描述符。

IOCTLIOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION返回错误“连接到系统的设备无法正常工作”。USBView 实用程序显示当设备处于低功耗状态时字符串描述符不可用。

在此输入图像描述

这种行为很奇怪,我在 USB 规范中没有找到任何参考。我检查了两台设备,得到了相同的行为。即使在状态下,我也能够获取其他描述符,例如设备描述符、BOS 描述符等D2

当USB设备处于低功耗状态时,有没有办法获取字符串描述符?如果没有,有没有办法暂时将其转为 D0 电源状态?也许 ACPI 就是答案,但它是一个非常低级的 API,我发现它很难理解。Windows 是否提供任何高级 API 来设置电源状态?

c++ windows usb ioctl acpi

6
推荐指数
1
解决办法
2895
查看次数

ARM系统模式与arm管理员模式有何不同?

为了将ARM处理器模式与x86操作模式(ring0到ring 3)进行比较,用户模式看起来就像ring3,用户空间程序在其中运行.但是我无法将ring0与系统模式或管理员模式联系起来.根据信息来源,似乎两种模式都可以很好地完成在特权模式下运行内核的工作.我能找到的两种模式之间的唯一区别是:

  1. 寄存器13和14以管理员模式存储,而对于系统模式,所有15个寄存器都是相同的.
  2. 系统模式不能直接在异常上输入,而管理员模式可以.
  3. 系统模式以某种方式防止链接寄存器的损坏.

你能解释一下这些模式之间的差异吗,来自x86背景的人可以理解吗?

另外,模式之间的细微架构差异(如库存寄存器的数量)如何使一个优于另一个?

embedded arm embedded-linux processor-architecture risc

5
推荐指数
1
解决办法
5360
查看次数

什么是Linux中的OE +?

以下是什么意思(OE+)

$ sudo cat /proc/modules | grep hello //hello_world is a kernel module created by me.
hello_world 20480 1 - Loading 0xffffffffc0221000 (OE+)
Run Code Online (Sandbox Code Playgroud)

这是我的情况.
我修补了Linux内核函数load_module(),它被调用finit_module(),用于insmod插入内核模块的系统调用.修补程序查找由我(已调用hello_world)安装创建的特定模块,当它执行时,它会阻止调用do_init_module(),而是返回0.do_init_call()负责调用模块的init功能,并将模块状态设置为live(MODULE_STATE_LIVE).

当我读到时/proc/modules,模块状态是Loading,这是预期的.但是我不明白(OE+)输出结尾的含义.这不会显示在任何其他模块上,如以下命令所验证.

$ sudo cat /proc/modules | grep OE
hello_world 20480 1 - Loading 0xffffffffc0221000 (OE+)
Run Code Online (Sandbox Code Playgroud)

我正在使用Linux内核v4.7.3.

更新

所有这些都发生在Qemu虚拟机中.在正在运行的主机上Linux 4.4.0-36-generic (Ubuntu),我得到以下内容.

$ sudo cat /proc/modules | grep OE …
Run Code Online (Sandbox Code Playgroud)

kernel-module linux-kernel

5
推荐指数
1
解决办法
989
查看次数

完成DPI缩放后,GET_X_LPARAM()与GetCursorPos()的区别如何?

我有一个应用程序,可以创建一个Windows托盘图标.当用户右键单击它时,将显示上下文菜单.应用程序正常工作,直到从控制面板完成DPI缩放.例如.当DPI缩放设置为150%(我登录时的缩放值)时,上下文菜单将正确显示,但是当我将DPI缩放更改为125%时(无需注销并再次记录 - 退出并再次登录后)他们同意),上下文菜单被移位,并显示在远离托盘图标的位置.如果我使用GetCursorPos()而不是获得鼠标坐标GET_X_LPARAM(wParam),则不会发生这种情况GET_Y_LPARAM(wParam).

在MSDN文档NOTIFYICONDATA(https://msdn.microsoft.com/en-us/library/windows/desktop/bb773352(v=vs.85).aspx)数据结构说GET_X_LPARAM(wParam),and GET_Y_PARAM(wParam)中,回调函数内部它处理uCallbackMessage应该给X和right-mouse-buttonclick事件的Y坐标(用于调用托盘图标的上下文菜单).当DPI以上述方式改变时,不会发生这种情况.GetCursorPos()但是继续给出正确的价值.

我觉得他们应该总是报告相同的价值.

编辑1 - 假设在右键单击后,鼠标没有移动,在这种情况下两者都应该给出相同的坐标.

编辑2 - Repro(有关复制错误的信息)

看看下面的开源项目Picotorrent.在NotifyIconController.cpp :: NotifyIconController :: Execute()中,我添加了以下代码行来打印GET_X_LPARAM()和GetCursorPos()返回的值(图像中突出显示的代码).

    TCHAR debug_string[50];
    _stprintf_s(debug_string,sizeof(debug_string), _T("\n\n[wParam      :(x,y)=(%d,%d)]\n"), GET_X_LPARAM(wParam), GET_Y_LPARAM(wParam));
    OutputDebugString(debug_string);

    POINT pt;
    GetCursorPos(&pt);
    _stprintf_s(debug_string,sizeof(debug_string),_T("[GetCursorPos:(x,y)=(%d,%d)]\n"), pt.x, pt.y);
    OutputDebugString(debug_string);
Run Code Online (Sandbox Code Playgroud)

添加的代码用于检查GET_X_LPARAM()和GetCursorPos()返回的值

程序Picotorrent在运行时会创建一个托盘图标.当用户右键单击托盘图标时,在单击时鼠标指针的位置上会显示一个上下文菜单.截至目前,为了显示上下文菜单,使用GET_X_LPARAM(wParam)和GET_Y_LPARAM(wParam)获得点击的X,Y坐标.

请参阅以下屏幕截图,其中显示了不同DPI缩放值下上下文菜单相对于托盘图标的位置.

下图显示了DPI缩放比例为150%时上下文菜单的位置.这是我登录系统时的DPI缩放值.

上下文菜单,150%DPI缩放

下图显示了DPI缩放更改为125%时上下文菜单的位置.请注意,Windows告诉我注销,然后重新登录.但由于我们的任务是研究为什么GET_X_LPARAM()和GetCursorPos()没有显示相同的值(无论是对还是错,无所谓).另请注意,托盘图标附近不再显示上下文菜单.请记住,我在这里使用GET_X_LPARAM(wParam)和GET_Y_LPARAM(wParam)来获取X和Y坐标以显示菜单,而不是GetCursorPos().

上下文菜单,DPI缩放比例为125%

现在,让我们在调试器的输出窗口中看到输出.

[wParam      :(x,y)=(1539,1045)]
[GetCursorPos:(x,y)=(1539,1045)]


[wParam      :(x,y)=(1606,1054)]
[GetCursorPos:(x,y)=(1927,1265)]
Run Code Online (Sandbox Code Playgroud)

另请参阅以下屏幕截图.

当DPI缩放更改时,GET_X_LPARAM()和GetCursorPos()返回不同的值

从输出中我们可以清楚地看到,最初GET_X_LPARAM()和GetCursorPos()同意坐标值,但是当缩放值改变时,它们不会.

mfc trayicon system-tray dpi windows-10

5
推荐指数
0
解决办法
498
查看次数

SHLoadIndirectString() 内部如何工作?

我一直在尝试从桌面应用程序获取系统上安装的所有 UWP 应用程序的显示名称(应用程序的用户友好名称)。我正在尝试使用SHLoadIndirectString()从与这些应用程序相对应的注册表项获取的资源字符串。让我们以 Windows 计算器为例。

\n\n

SHLoadIndirectString() 用法

\n\n

HKEY_CLASSES_ROOT\\Local Settings\\Software\\Microsoft\\Windows\\CurrentVersion\\AppModel\\\xe2\x80\x8c\xe2\x80\x8bRepository\\Packages\\\xe2\x80\x8c\xe2\x80\x8bMicrosoft.WindowsCal\xe2\x80\x8c\xe2\x80\x8bculator_10.1705.1301\xe2\x80\x8c\xe2\x80\x8b.0_x64__8wekyb3d8bbw\xe2\x80\x8c\xe2\x80\x8be\\DisplayName它的资源字符串可以从注册表项中获取。\n我的系统上它的资源字符串是@{Microsoft.WindowsCalculator_10.1705.1301.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.WindowsCalculator/Resources/AppStoreName}

\n\n

为了获得显示名称,我会这样做SHLoadIndirectString(@{Microsoft.WindowsCalculator_10.1705.1301.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.WindowsCalculator/Resources/AppStoreName})

\n\n

实验观察

\n\n
    \n
  1. (实验1)我用于SHLoadIndirectString()两个不同的用户(U1和U2)。U1 的语言设置为英语,U2 的语言设置为法语 (FR-fr)。当从 U1 运行 SHLoadIndirectString() 时,它返回Windows Calculator,对于 U2 我得到Calculatrice Windows。因此,同一资源字符串的返回值取决于当前用户的语言设置。
  2. \n
  3. (实验2)我在U2中安装了一个UWP应用程序,并对DiplayName中的资源字符串执行了SHLoadIndirectString()。我在 U1 中遇到错误,但在 U2 中,它正确地给了我所需的字符串。
  4. \n
  5. (实验3)当我将资源文件的路径添加到(resources.pri)资源字符串时,我在U1中没有收到错误。之前的资源字符串是@{DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar_5.1.12.0_x64__3nf5xjt6s13jt?ms-resource://DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar/Resources/AppName},我后来在@{C:\\\\Program Files\\\\WindowsApps\\\\DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar_5.1.12.0_x64__3nf5xjt6s13jt\\\\resources.pri?ms-resource://DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar/Resources/AppName}传递给 之前SHLoadIndirectString()
  6. \n
\n\n

寻找解决方案

\n\n
    \n
  1. SHLoadIndirectString() 的文档说它的返回值取决于Shell environment or ResourceContext,但没有给出每个值的详细信息。
  2. \n
  3. ReactOSwine是两个尝试重新创建 …

winapi wine react-os

5
推荐指数
1
解决办法
888
查看次数

如何知道设备是否已被用户明确禁用?

使用设备管理器,用户可以明确启用/禁用设备,如下图所示.

在此输入图像描述

对于给定的设备,我想知道它是否当前处于用户禁用/启用状态.

我尝试了以下方法

  1. CM_Get_DevNode_Status(&status, &problem, data.DevInst, 0);我希望存在DN_STARTED,或者DN_DRIVER_LOADED会告诉我.但是,当设备连接/断开连接时,即使操作系统正在加载/卸载驱动程序,这些也可能为零.例如,已启用并为其加载驱动程序的设备.DN_STARTED将是1,但当我们断开设备时,它将设置为零,然后从设备管理器中删除设备的条目.
  2. SetupDiGetDeviceRegistryProperty(..., SPDRP_INSTALL_STATE, ...)我的状态CM_INSTALL_STATE_INSTALLED应该意味着设备已启用.但即使对于禁用的设备,该函数也会返回此状态.
  3. 使用WMI我能够获得所需的信息,但我在PowerShell中使用了wmi.我不想使用wmi,因为在本机c ++中实现起来非常困难.我使用了以下查询.

    Select Name, Availability, ConfigManagerErrorCode, ConfigManagerUserConfig from Win32_PnPEntity where Name = 'NVIDIA Quadro M1000M'

上述查询中的ConfigManagerErrorCode,如果设置为22,表示设备已被禁用,21表示Windows正在删除设备

我正在寻找一个非wmi解决方案.

c++ wmi device-driver device-manager setupapi

5
推荐指数
1
解决办法
650
查看次数

如何使用雷电3在计算机之间共享GPU?

许多基于 Thunderbolt 3(通过 USB-C)的外部 GPU 扩展坞已经激增(例如 Razer core)。通过这些,我们可以利用笔记本电脑上的桌面级 GPU。我想了解反向是否也成立。如果我有一台内置良好 GPU 的笔记本电脑或台式机,我可以使用 TB3(Thunderbolt 3) 将其连接到另一台缺乏良好 GPU 的笔记本电脑或台式机吗?

这个想法是从另一台机器使用一台机器中存在的 GPU,而不使用外部 GPU 底座。这两台机器都将配备 TB3 over USB-C 接口。

请参见下图。

通过 TB3 共享 GPU

更新1

此链接 (https://communities.intel.com/thread/122304)提供了一些提示。

This means interesting things like using your Thunderbolt 3 desktop as an external graphics card for your laptop should be possible. This would be implemented by exposing the GPU to the Thunderbolt connection as if it were a VM running on the desktop (using the IOMMU).
Run Code Online (Sandbox Code Playgroud)

c++ usb gpu windows-10

5
推荐指数
0
解决办法
1956
查看次数

如何检查 C++ 智能指针内存分配是否成功?

考虑智能指针的以下用法std::unique_ptr

std::unique_ptr<char> sp(new(std::nothrow) char[sz]);
Run Code Online (Sandbox Code Playgroud)

我如何检查是否new成功?

我有两个选择:

  1. 方法 1 - 检查 bool 值: if(!sp){}
  2. 方法 2 - 与空指针比较: if(sp==nullptr){}

示例(来源

#include <iostream>
#include <memory>
using namespace std;

int main() {
    constexpr long long sz = 1000000e10;
    
    //raw pointer
    auto ptr = new(std::nothrow) char[sz];
    if(ptr==nullptr)
    {
        cout<<"ptr nullptr"<<endl;
    }
    
    //smart pointer
    std::unique_ptr<char> sp(new(std::nothrow) char[sz]);
    
    if(!sp)
    {
        cout<<"sp nullptr bool"<<endl;
    }
    
    if(sp==nullptr)
    {
        cout<<"sp nullptr =="<<endl;
    }
    return 0;
    
}
Run Code Online (Sandbox Code Playgroud)

输出:

std::unique_ptr<char> sp(new(std::nothrow) char[sz]);
Run Code Online (Sandbox Code Playgroud)

显然,方法 1 和方法 …

c++ smart-pointers new-operator unique-ptr c++11

-4
推荐指数
1
解决办法
1424
查看次数