【问题标题】:Invalid conversion from 'DWORD' to 'const char *'从“DWORD”到“const char *”的无效转换
【发布时间】:2012-03-17 02:22:33
【问题描述】:

我正在尝试编译一些代码,但出现错误:

DWORDconst char * 的转换无效

这是我要编译的代码:

hWindow = FindWindow(NULL, "Window");    
if (hWindow){
    GetWindowThreadProcessId(hWindow, &pid);
}
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
if(hProcess != NULL) {
    SetWindowText(GetDlgItem(MyWindow, MyStatic), pid);
}

如何将DWORD 转换为const char *

【问题讨论】:

  • SetWindowText(GetDlgItem(MyWindow, MyStatic), pid); pid 导致错误,猜你不能在这里使用 dwords

标签: c++ winapi type-conversion


【解决方案1】:

SetWindowText 需要一个 const char *(即一个 C 字符串),而你传递给它一个数字 (pid),很明显你得到了一个错误。

执行转换的标准 C++ 方法是使用字符串流(来自标头 <sstream>

std::ostringstream os;
os<<pid;
SetDlgItemText(MyWindow, MyStatic, os.str().c_str());

(这里我使用SetDlgItemText而不是GetDlgItem+SetWindowText来节省打字,但它是一样的)

或者,您可以使用snprintf

char buffer[40];
snprintf(buffer, sizeof(buffer), "%u", pid);
SetDlgItemText(MyWindow, MyStatic, buffer);

【讨论】:

  • 任何其他方式,然后使用字符串流#include 使我的输出变大
  • 你在说什么输出?您是在谈论最终的可执行文件大小吗?您是否在编译器中启用了优化(="release mode" 或其他)?
  • 是的,我认为这可能是 GCC 的一个错误,是的,我在发布模式下使用 stip 调试和所有优化我的最终 exe 是 25kb 没有 sstream 和 450kb
  • 425kb 增加了 90%?
  • 这真的很奇怪......在我的 Linux 机器上,仅使用字符串流中的内容生成一个 13 KB 的可执行文件,仅比 Hello World 多 5 KB。
【解决方案2】:

在这一行

SetWindowText(GetDlgItem(MyWindow, MyStatic), pid);

pid 是一个 DWORD(正如您在 GetWindowThreadProcessId(hWindow, &amp;pid) 中使用的那样,它采用 LPDWORD 作为第二个参数)。但是,SetWindowText 需要一个 C 字符串作为它的第二个参数,因此您必须传递 char *char [] 类型的值,而不是 pid

要显示pid的值,可以使用sprintf

char * str = new char[10];
sprintf(str,"%d",pid);

您可能需要稍微修改str 的大小(10 可能太小,或者比需要的大 - 这取决于您和您的情况)。

【讨论】:

  • 你知道任何不使用字符串流的好方法,我一直在尝试。
  • @user1218395:刚刚添加了一个sprintf 示例。
  • 不编译无法在初始化中将 'char**' 转换为 'char*'|不喜欢你的第一行
  • 别忘了释放分配的内存(由new char[10]分配):delete str。您可以使用不需要释放的局部变量,而不是分配动态内存:char str[10];
猜你喜欢
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 2014-02-05
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多