65.9K
CodeProject 正在变化。 阅读更多。
Home

45 天系列:Codeproject VC++ 论坛问答 - IV

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (62投票s)

2005 年 6 月 15 日

CPOL

42分钟阅读

viewsIcon

775250

2005 年 4 月 25 日至 2005 年 6 月 8 日期间 VC++ 论坛的问答集合。

引言

本文是关于 2005 年 4 月 25 日至 2005 年 6 月 8 日(45 天)在 Visual C++ 论坛上提出的问题和解答的汇编。

感谢论坛成员的贡献,他们帮助了同行。为了保持文章的风格,我修改了一些原始评论(对此表示歉意)。如果我遗漏了什么,请随时发邮件给我或在下方留言。

目录

[4 月 25 日至 5 月 3 日]

问 1.01 如何获取当前激活的应用程序、应用程序名称和窗口标题?
问 1.02 如何在 VC++ 中获取驱动器卷序列号?
问 1.03 如何获取虚拟文件夹(如“我的文档”、“回收站”)的绝对路径?
问 1.04 Visual C++ 中是否有 XML 解析器的包装器?
问 1.05 如何在基于 DOS 的 C++ 程序中将控制台显示模式更改为全屏模式?
问 1.06 如何在组合框 (MFC) 中禁用鼠标滚轮?
问 1.07 如何运行一个应用程序一段时间然后停止它?
问 1.08 是否有“官方 C++ 规则”(或许指南比规则更合适)网站?
问 1.09 获取文件修改日期/时间的最优方法是什么?
问 1.10 如何监视目录和注册表是否有任何修改或更新?
问 1.11 如何检测显示器中的多个 VGA 卡?
问 1.12 如何使数据到达整个应用程序?
问 1.13 能否在不丢失精度的情况下将此数组归一化到 0.0 到 0.1(并保持为浮点数)?
问 1.14 如何在计算机即将关机时运行应用程序?
问 1.15 如何从特定目录查找 Unicode 文件名?
问 1.16 如何将 int 转换为 char*?
问 1.17 如何在项目中添加文件版本信息?
问 1.18 如何实现 1 毫秒的延迟?

[5 月 4 日至 5 月 12 日]

问 2.01 如何检测 IE/浏览器版本?
问 2.02 AfxGetAppName() 是一个 MFC 函数,是否有等效的 Win32 API?
问 2.03 套接字连接期间如何获取远程 IP?
问 2.04 如何限制我的应用程序只运行一个实例?
问 2.05 如何使用 nmake?
问 2.06 command.com 和 cmd.exe 有什么区别?
问 2.07 如何在 VC++ 中使用 unistd.h,或者这个头文件的定义是什么?
问 2.08 如何动态更改列表控件的列名?
问 2.09 有人知道获取 mp3 采样率、比特率和时长的包装类吗?
问 2.10 如何获取拥有焦点的对话框控件的 ID?
问 2.11 是否可以获取 HWND 和进程句柄之间的信息?
问 2.12 如何在不结束字符串的情况下在文本字符串中包含“?
问 2.13 如何检查字符串是否为数字?
问 2.14 如何更改目录的属性?
问 2.15 如何通过代码找出我的应用程序正在使用多少处理能力?
问 2.16 如何找出有关计算机处理器的信息,如制造商、时钟速度等?
问 2.17 有人见过查找梅森素数的代码吗?
问 2.18 如何将 DWORD (32 位) 值转换为四个字节 (32 位) 的字节数组?
问 2.19 如何启动一个在 Windows 启动时隐藏但其他时候可见的程序?
问 2.20 这个错误是什么:“error C2664: 'TextOutW' : cannot convert parameter 4 from 'char [10]' to 'const unsigned short *'”?
问 2.21 如何为应用程序应用 XP 风格?

[5 月 13 日至 5 月 21 日]

问 3.01 如何确定 IE 是否已完成加载?
问 3.02 如何更新编辑控件的文本?
问 3.03 如何获取控制台程序的输出?
问 3.04 如何使用 Win32 API 在状态栏中添加进度条?
问 3.05 如何在 MFC 对话框中设置背景图片?
问 3.06 如何检测互联网连接是否可用?
问 3.07 如何连接到网站并将 HTML 页面保存到文件?
问 3.08 只有 HWND 时,如何检索 HINSTANCE?
问 3.09 如何在 CFileDialog 中设置根文件夹?
问 3.10 如何获取指定工作组中的计算机列表?
问 3.11 如何获取逻辑驱动器所在的物理驱动器编号?
问 3.12 如何通过编程将“脱机工作”状态更改为正常的“在线”状态?
问 3.13 如何找到获取进程所有者用户名(或用户 ID)的方法?
问 3.14 如何捕获用户单击“x”按钮的事件?
问 3.15 如何启动带有附件的电子邮件客户端?
问 3.16 如何更改编辑控件的前景色?
问 3.17 是否有方法确定正在运行的操作系统?
问 3.18 如何在用户注销时收到通知?
问 3.19 如何找出我的应用程序当前占用了多少内存(私有字节)?
问 3.20 如何判断某个路径或目录是否存在?
问 3.21 注册表项更改后如何刷新 Explorer 窗口?
问 3.22 如何确定状态栏的像素高度?
问 3.23 如何复制文件?
问 3.24 如何在 VC++ 中旋转 GDI 对象而不使用 setworldtransform?
问 3.25 什么是 #pragma pack()?

[5 月 22 日至 5 月 30 日]

问 4.01 如何在不使用注册表和 MFC 的情况下获取 HDD ID、主板 ID、CDROM 驱动器 ID 等参数?
问 4.02 如何获得屏幕保护程序已激活的通知?
问 4.03 如何在另一个 .cpp 文件中访问 Doc.h 中声明的变量?
问 4.04 如何获取所有可用的时区?
问 4.05 如何设置工具栏上按钮的文本?
问 4.06 如何获取一个 EXE 的主图标,然后用它替换另一个 EXE 的主图标?
问 4.07 如何确保有人登录到计算机?
问 4.08 如何访问映射的网络驱动器?
问 4.09 我使用 Visual C++ 6.0 编写了应用程序,如何确定我提供了哪个版本的 MFCxx.dll?
问 4.10 加速键和热键有什么区别?
问 4.11 如何从十进制数中提取整数部分?例如,如果我有 3.13,只取 3?
问 4.12 如何判断鼠标位置是否在特定行上?
问 4.13 如何获取控件的类型?
问 4.14 如何在程序中使用 CSocket 类设置超时值?
问 4.15 是否有方法/机制修改当前日期值,使其在 C 运行时库中成为下个月的最后一天?
问 4.16 如何以编程方式建立 Windows 拨号连接?
问 4.17 如何在基于对话框的应用程序中裁剪图像?
问 4.18 如何加载其参数仅在运行时才知道的 DLL 函数?

[5 月 31 日至 6 月 8 日]

问 5.01 如何移除窗口的关闭按钮?
问 5.02 如何更改编辑控件的前景色和背景色?
问 5.03 RC 文件的结构是什么?
问 5.04 如何在任务栏右角附近创建一个弹出消息?
问 5.05 如何在 Visual C++ 中制作安装程序?
问 5.06 如何在运行时将文本文件转换为 BMP?
问 5.07 如何直接或通过 LAN 获取连接到 PC 的默认打印机?
问 5.08 如何以编程方式更改 IE 中当前加载的 HTML?
问 5.09 如何在没有安装 MS Access 的 PC 上使用 MS Access 2000 创建的数据库?
问 5.10 MFC 的 DeflateRect 的 SDK 函数是什么?
问 5.11 如果我给当前日期增加 100 天,如何得到修改后的日期?
问 5.12 如何在套接字上传输图像文件?
问 5.13 我的服务在与服务管理器交互时,如何模拟管理员(服务可以访问登录信息)?
问 5.14 是否有 SDK 函数可以将大缓冲区从大端序转换为小端序?
问 5.15 如何将十六进制转换为二进制?
问 5.16 如何通过编程检查剪贴板中的文本?
问 5.17 如何通过编程得知网络摄像头已连接到 USB 端口?
问 5.18 如何在没有电子邮件账户的情况下从我的程序发送电子邮件?
问 5.19 如何通过窗口消息发送数据/UDT?
问 5.20 如何获取通过网卡(标准以太网卡)接收/发送的字节/数据包数量?
问 5.21 谁能给我推荐 RAW 数据库格式?
问 5.22 如何在 MDI 结构中检查当前文档是否正在关闭?
问 5.23 串行通信程序中 EV_BREAK 事件检测的前提条件是什么?
问 5.24 如何在 C++ 代码中获取 DPI 值?
问 5.25 是否有简单的方法使我的程序的 Exe 在调试和发布版本中具有不同的图标?
问 5.26 有没有办法处理任务管理器强制退出应用程序的情况?
问 5.27 如何在 VC++ 中确定计算机名称?
问 5.28 如何更改复选框控件在运行时位置?
问 5.29 调用 SHBrowseForFolder 函数时如何显示隐藏文件夹?
问 5.30 如何将 UNICODE 数据转换为 ASCII?

问答:-

[4 月 25 日至 5 月 3 日]

问 1.01 如何获取当前激活的应用程序、应用程序名称和窗口标题? [顶部^]

答:ThatsAlok 引用:-

以下 API 将有所帮助:-
[GetForegroundWindow] 获取当前拥有键盘焦点的应用程序的句柄
[GetWindowText] 检索与窗口句柄关联的标题文本
[GetWindowModuleFileName] 返回应用程序的路径!

问 1.02 如何在 VC++ 中获取驱动器卷序列号? [顶部^]

答:DavidCrow 引用:-

使用 [GetVolumeInformation] 或查看此处
http://msdn.microsoft.com/library/default.asp?url= /library/en-us/fileio/fs/enumerating_mount_points.asp

问 1.03 如何获取虚拟文件夹(如“我的文档”、“回收站”等)的绝对路径? [顶部^]

答:Dean Michaud 引用:-

请查看 [SHGetSpecialFolderPath()] 和 [SHGetFolderPath()] 的帮助。

问 1.04 Visual C++ 中是否有 XML 解析器的包装器? [顶部^]

答:cedric moonen 引用:-

也许您会发现一些有趣的东西 https://codeproject.org.cn/cpp/#Parsers


问 1.05 如何在基于 DOS 的 C++ 程序中将控制台显示模式更改为全屏模式? [顶部^]

答:stolid_rock 引用:-

您需要使用 [SetConsoleWindowInfo] 函数来设置大小。但在此之前,您需要使用 [GetConsoleWindow]、[GetConsoleScreenBufferInfo] 等函数来实现实际效果。


问 1.06 如何在组合框 (MFC) 中禁用鼠标滚轮? [顶部^]

答:Rage 引用:-

一个非常棘手的技巧是派生一个类自组合框控件,用它来代替您现有的组合框控件,捕获鼠标滚轮消息 WM_MOUSEWHEEL,然后不将其转发给基类...


问 1.07 如何运行一个应用程序一段时间然后停止它? [顶部^]

答:CodeBeetle 引用:-

使用 [createprocess()]:用于创建进程,然后调用 [waitforsingleobject()] 等待对象执行,最后调用 [terminateprocess()] 来终止应用程序。

示例类:http://codebeetle.com/page.php?id=31


问 1.08 是否有“官方 C++ 规则”(或许指南比规则更合适)网站? [顶部^]

答:stolid_rock 引用:-

请查看 http://www.csc.lsu.edu/~kosmas/C++guidelines.pdf


问 1.09 获取文件修改日期/时间的最优方法是什么? [顶部^]

答:DavidCrow 引用:-

如何使用 [GetFileAttributesEx()]?

Ravi Bhavnani 引用:-

或者 CFile::GetStatus() 或 _stat() 或 GetFileTime()


问 1.10 如何监视目录和注册表是否有任何修改或更新? [顶部^]

答:ThatsAlok 引用:-

要监视目录/文件更改,请使用 [ReadDirectoryChangesW],要监视注册表,请使用 [RegNotifyChangeKeyValue]。


问 1.11 如何检测显示器中的多个 VGA 卡? [顶部^]

答:DavidCrow 引用:-

查看 [EnumDisplayDevices()]。


问 1.12 如何使数据到达整个应用程序/或使其在整个应用程序中全局可用? [顶部^]

答:Gary R. Wheeler 引用:-

使数据全局化。最简单的方法是将其放在 stdafx.h 中,并在声明前加上 extern 关键字。在主程序中,当您从注册表中检索数据时,重复声明而不带 extern 关键字。


问 1.13 能否在不丢失精度的情况下将此数组归一化到 0.0 到 0.1(并保持为浮点数)? [顶部^]

答:Christian Graus 引用:-

不能 - 显而易见,如果您将数字压缩到更小的范围,您将丢失精度。浮点数本身就有精度问题,如果您想提高精度,应该使用 double,如果想绝对精确,应该使用定点格式。


问 1.14 如何在计算机即将关机时运行应用程序? [顶部^]

答:DavidCrow 引用:-

您需要一个单独运行的应用程序来处理 WM_QUERYENDSESSION 消息。当收到该消息时,返回 0,启动“基于对话框的应用程序”,然后通过使用 ExitWindowEx API 来自行关机。

问 1.15 如何从特定目录查找 Unicode 文件名? [顶部^]

答:Ryan Binns 引用:-

查看 [FindFirstFileW()]、[FindNextFileW()] 和 [FileFindCloseW]。

问 1.16 如何将 int 转换为 char*? [顶部^]

答:mkuhac 引用:-

         TCHAR szBuffer[16]; 
          INT iValue = 5; 
          ::wsprintf(szBuffer, TEXT("%d"), iValue);   

        

ThatsAlok 引用:-

         int nNum=10; 
         char szNum[10]; 
         itoa(nNum,szNum,10);
        

问 1.17 如何在项目中添加文件版本信息? [顶部^]

答:DavidCrow 引用:-

只需向其添加版本资源。在工作区窗格的资源视图选项卡中单击。按 Ctrl+R 插入新资源。从列表中选择版本。

Blake Miller 引用:-

将资源文件 (*.RC) 添加到您的项目中。向资源文件中添加版本信息资源。

问 1.18 如何实现 1 毫秒的延迟? [顶部^]

答:Adi Narayana Vemuru 引用:-

编写自己的延迟例程,使用高分辨率 API,如 [QueryPerformaceCounter()] 和 [QueryPerformaceFrequency()]。您甚至可以实现微秒级计时器。

[5 月 4 日至 5 月 12 日]

问 2.01 如何检测 IE/浏览器版本? [顶部^]

答:Priyank Bolia 引用:-

查看注册表项 **HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version**。我希望这会起作用。

DavidCrow 引用:-

只需使用 [GetFileVersionInfo()] 和 [VerQueryValue()]。

问 2.02 AfxGetAppName() 是一个 MFC 函数,是否有等效的 Win32 API?[顶部^]

答:DavidCrow 引用:-

 
         char szPath[_MAX_PATH], szBase[_MAX_FNAME],
             szExt[_MAX_EXT];
             
         GetModuleFileName(NULL, szPath,sizeof(szPath));
             
         _splitpath(szPath, NULL, NULL, szBase, szExt);
        

Michael Dunn 引用:-

调用 GetModuleFileName(),然后对完整路径调用 PathFindFileName()。

问 2.03 套接字连接期间如何获取远程 IP? [顶部^]

答:ThatsAlok 引用:-

使用 [getpeername] API。


问 2.04 如何限制我的应用程序只运行一个实例? [顶部^]

答:许多人引用:-

问 2.05 如何使用 nmake? [顶部^]

答:PJ Arends 引用:-

首先阅读 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/ _asug_overview.3a_.nmake_reference.asp

问 2.06 command.com 和 cmd.exe 有什么区别? [顶部^]

答:DavidCrow 引用:-

command.com 用于与 16 位和 Windows 9x 应用程序的向后兼容。cmd.exe 在两者上都不可用。一个明显的区别是它们如何处理空格字符。

例如,命令 md this folder has spaces 在 command.com 中会失败,但在 cmd.exe 中会成功,尽管会创建四个文件夹。为了解决这个问题,文件夹名称必须用引号括起来(md "this folder has spaces")。

问 2.07 如何在 VC++ 中使用 unistd.h,或者这个头文件的定义是什么? [顶部^]

答:ThatsAlok 引用:-

这是 **Unistd.h** 的定义。

   

        /* * This file is part of the Mingw32 package.
         * * unistd.h maps     (roughly) to io.h */
         
         #ifndef _UNISTD_H

         #define _UNISTD_H
         #include <IO.H>
         #include <PROCESS.H>

         #endif /* _UNISTD_H */
         

将其保存为 **Unistd.h** 并包含在您的项目中。

问 2.08 如何动态更改列表控件的列名? [顶部^]

答:rateep 引用:-

您尝试过 CListCtrl::SetColumn(.....) 吗?

问 2.09 有人知道获取 mp3 采样率、比特率和时长的包装类吗? [顶部^]

答:Alexander M. 引用:-

在这里您可以找到所有需要的信息:https://codeproject.org.cn/audio/MPEGAudioInfo.asp

问 2.10 如何获取拥有焦点的对话框控件的 ID? [顶部^]

答:ThatsAlok 引用:-

使用 **GetFocus()** 查找当前拥有键盘焦点的控件。将 **GetFocus** 调用返回的 HWND 或 CWnd 传递给 **GetDlgCtrlID**,它将返回控件的数字 ID!

Jörgen Sigvardsson 引用:-

Alok 的说法,外加您可以使用 int id = ::GetWindowLong(::GetFocus(), GWL_ID);

如果您想保留 Win32。

问 2.11 是否可以获取 HWND 和进程句柄之间的信息? [顶部^]

答:完整问题:-

我需要:从进程句柄获取主窗口句柄(我知道进程句柄)。从窗口句柄获取进程信息(即进程 ID 或句柄)(我知道窗口句柄)?

回答:- cmk 引用:-

1. - 使用 GetProcessId() 从进程句柄获取进程 ID。

  • 使用 EnumWindows() 查看每个顶级窗口。
  • 对于每个顶级窗口,调用 GetWindowThreadProcessId() 获取用于创建窗口的线程 ID 和进程 ID。
  • 当找到由指定进程句柄/ID 创建的顶级窗口时,中断。

2. - 使用 GetWindowThreadProcessId() 获取用于创建窗口的线程 ID 和进程 ID。

问 2.12 如何在不结束字符串的情况下在文本字符串中包含“? [顶部^]

A. Rama Krishna Vavilala 引用:-

BSTR bstRet=SysAllocStringByteLen("Some text with the inch symbol\" and then end",44);

问 2.13 如何检查字符串是否为数字? [顶部^]

答:Christian Graus 引用:-

我认为您想要的函数是 **IsDigit**。这是 MSDN 参考。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_isdigit.2c_.iswdigit.asp

Ted Ferenc 引用:-

老式的方法是使用 **strtoul** 并检查 **'end pointer'**。但请注意,如果数字非常大,它将因溢出而失败。

PJ Arends 引用:-

使用 **strtod** 而不是 **atof**。它有一个参数指向它无法识别为数字一部分的第一个字符。如果该字符不是 NULL(字符串末尾),则该字符串不是数字。它考虑您当前的区域设置和指数表示法。

问 2.14 如何更改目录的属性? [顶部^]

答:DavidCrow 引用:-

这对我来说有效。

          if (! SetFileAttributes("c:\\ResOrg",FILE_ATTRIBUTE_READONLY))
              { 
               DWORD dwError = GetLastError();
              }
        

问 2.15 如何通过代码找出我的应用程序正在使用多少处理能力? [顶部^]

答:DavidCrow 引用:-

看看这是否有所帮助。

https://codeproject.org.cn/threads/getprocesstimes.asp?df=100&forumid=15846&select=799345#xx799345xx

问 2.16 如何找出有关计算机处理器的信息,如制造商、时钟速度等? [顶部^]

答:DavidCrow 引用:-

尝试 **Win32_Processor** WMI 类。

问 2.17 有人见过查找梅森素数的代码吗? [顶部^]

答:DavidCrow 引用:-

谷歌搜索 GIMPS 项目。我本来想推荐梅森网站,但它目前已关闭。

John M. Drescher 引用:-

http://www.mersenne.org/

http://www.mersenne.org/source.htm

问 2.18 如何将 DWORD (32 位) 值转换为四个字节 (32 位) 的字节数组? [顶部^]

答:PJ Arends 引用:-

        for (int i = 3; i >= 0; --i)
         { 
           length[3 - i] = (dwLength & (0xff <<(i * 8))) >> (i * 8);}
              

Michael Dunn 引用:-

        DWORD dwLength=(DWORD) file.GetLength();
        BYTE length[sizeof(DWORD)];
        *(DWORD*) &length[0] = dwLength; 
        

Bouli 引用:-

实际上我找到了以下方法:-

            length[0]=HIBYTE(HIWORD(dwLength));
            length[1]=LOBYTE(HIWORD(dwLength)); 
            length[2]=HIBYTE(LOWORD(dwLength)); 
            length[3]=LOBYTE(LOWORD(dwLength));
         

问 2.19 如何启动一个在 Windows 启动时隐藏但其他时候可见的程序? [顶部^]

答:ThatsAlok 引用:-

我相信您正在通过存储在注册表位置 **RUN** 中的键在 Windows 启动时启动您的应用程序。现在,要区分用户是单击启动应用程序还是 Windows 在启动时启动它,您只需为该注册表位置提供一个命令行参数,即:将应用程序路径存储为

c:\\your_app_path\\app.exe -hidden

现在,每当 Windows 在启动时启动您的应用程序时,您都会得到 **-hidden** 作为命令行参数,您只需解析命令行 [使用 **GetCommandLine()**:检索命令行参数] 来隐藏或显示您的应用程序。

问 2.20 这个错误是什么:“error C2664: 'TextOutW' : cannot convert parameter 4 from 'char [10]' to 'const unsigned short *'”? [顶部^]

答:RChin 引用:-

听起来 DLL 是使用 **UNICODE** 配置编译的。用 **TEXT()** 或 **_T("")** 括起您的字符串,它应该可以工作。这将为此函数使用适当的字符串类型(**char** 或 **wchar_t**)。

问 2.21 如何为应用程序应用 XP 风格? [顶部^]

答:DavidCrow 引用:-

[5 月 13 日至 5 月 21 日]

问 3.01 如何确定 IE 是否已完成加载? [顶部^]

答:Kharfax 引用:-

您应该创建一个浏览器帮助对象(在 Google 中搜索 BHO)并处理 DOCUMENT_COMPLETE 事件。

问 3.02 如何更新编辑控件的文本? [顶部^]

答:Ravi Bhavnani 引用:-

如果 m_edit 是控件(不是数据)成员(即 m_edit 的类型是 CEdit),
请执行以下操作:m_edit.SetWindowText ("Test");
来设置编辑控件的文本。

Priyank Bolia 引用:-

使用:DDX_Text(pDX, IDC_EDIT1, m_edit);
并分配值后使用
m_edit = "Test";
UpdateData( false );


问 3.03 如何获取控制台程序的输出? [顶部^]

答:Ravi Bhavnani 引用:-

这篇文章 [^] 可能会有帮助。

DavidCrow 引用:-

您可以阅读这里:-

问 3.04 如何使用 Win32 API 在状态栏中添加进度条? [顶部^]

答:Jack Squirrel 引用:-

  1. 创建带有窗格的状态栏。
  2. 使用 SB_GETRECT 获取状态栏窗格的矩形(进度控件将放置在此处)。
  3. 创建以状态栏为父项的进度控件,并使用(2)中返回的矩形值来设置其位置。
  4. 根据需要操作进度控件。

问 3.05 如何在 MFC 对话框中设置背景图片? [顶部^]

答:DavidCrow 引用:-

这个有帮助吗?https://codeproject.org.cn/dialog/bmpdlg01.asp

问 3.06 如何检测互联网连接是否可用? [顶部^]

答:ThatsAlok 引用:-

此 MS 资源将帮助您:http://www.pcausa.com/resources/InetActive.txt

Taka Muraoka 引用:-

您会认为这很容易,但事实并非如此。看看这个:-
http://ewbi.blogs.com/develops/2003/12/wmi_and_network.html
了解更多信息。

问 3.07 如何连接到网站并将 HTML 页面保存到文件? [顶部^]

答:ThatsAlok 引用:-

本文将帮助您从 Internet 服务器/域检索 HTML 页面:https://codeproject.org.cn/internet/amhttputils.asp

Ravi Bhavnani 引用:-

正如 Alok 所指出的,您可以使用 Ander 的 AmHttpUtilities 类。如果您需要进行更复杂的 HTML 内容解析,请参阅这篇文章[^]

问 3.08 只有 HWND 时,如何检索 HINSTANCE? [顶部^]

答:bharadwajgangadhar 引用:-

要获取 hInstance,您可以使用 **AfxGetWinApp()** SDK 函数。它检索应用程序的 hInstance。

PJ Arends 引用:-

使用 **GetWindowLong()** 和 **GWL_HINSTANCE** 标志。

问 3.09 如何在 CFileDialog 中设置根文件夹? [顶部^]

答:PJ Arends 引用:-

CFileDialog 有一个成员 `m_ofn`,它是一个 `OPENFILENAME` 结构。在该结构中,您必须将 `lpstrInitialDir` 变量设置为指向包含所需文件夹的字符串。

            CFileDialog FileDialog(TRUE);
            FileDialog.m_ofn.lpstrInitialDir ="C:\\MyDirectory";
            FileDialog.DoModal();
            

问 3.10 如何获取指定工作组中的计算机列表? [顶部^]

答:DavidCrow 引用:-

如何使用 NetGroupGetUsers()?

问 3.11 如何获取逻辑驱动器所在的物理驱动器编号? [顶部^]

答:James R. Twine 引用:-

如果您需要发送 IOCTLs(DeviceIoControl)等操作,您还可以通过使用以下语法打开设备:-
\\.\C: - 打开驱动器“C”的物理设备
\\.\D: - 打开驱动器“D”的物理设备
\\.\A: - 打开驱动器“A”的物理设备


我不知道该格式和
\\.\PhysicalDrivex 格式何时可以互换使用,但我知道在使用 **HANDLE** 进行 **DeviceIoControl** 时可以使用它。
另外,虽然您可能不会遇到,但在旧版本的
**Win32_DiskDrive WMI 类** 中有一个 bug,它限制了返回的驱动器数量。上面的方法
也应该可以在 SP4 之前的 Windows NT 4.0 版本上工作,但 WMI 方法不行。
问 3.12 如何通过编程将“脱机工作”状态更改为正常的“在线”状态? [顶部^]
答:ThatsAlok 引用 **:-**

** 查看此 API [InternetGoOnline] 是否有帮助?如果拨号,您也可以使用这些 API [InternetAutodial] 和 [Internetdial]。

James R. Twine 引用:-

我会查找 InternetCheckConnection(...),它有一个强制连接的标志;以及 InternetAttemptConnect(...)。

问 3.13 如何找到获取进程所有者用户名(或用户 ID)的方法? [顶部^]

请查看 MSDN 中的 **PSAPI** 和 **Tool Help** 库。

CodeBeetle 引用:-

答:James R. Twine 引用:-

试试这个... http://codebeetle.com/page.php?al=process_username

问 3.14 如何捕获用户单击“x”按钮的事件? [顶部^]

处理 **WM_SYSCOMMAND** 并检查 **SC_CLOSE** 情况。

问 3.15 如何启动带有附件的电子邮件客户端? [顶部^]

答:Ravi Bhavnani 引用:-

我认为您不能,您可能需要使用 MAPI(在 MSDN 中查找“Simple MAPI”)。

问 3.16 如何更改编辑控件的前景色? [顶部^]

答:James R. Twine 引用:-

处理 **WM_CTLCOLOR** 消息并对提供的 DC 调用 **SetTextColor()**。

问 3.17 是否有方法确定正在运行的操作系统? [顶部^]

答:PJ Arends 引用:-

是否有方法确定正在运行的操作系统?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/osversioninfo_str.asp

答:Christian Graus 引用:-

但是,正如 Shog 所说,如果您使用不受支持的 API,那么您需要动态加载它们,否则您的应用程序将无法运行,即使您从未运行过调用它们的代码。另一种选择是编写自己的版本。我几年前就这样做了 TransparentBlt 和 AlphaBlend,以便支持 W95 并仍可调用它们。
有多少种不同的 Windows 平台?

假设您从 W95 开始,有 W95、W98、NT4、WME、W2000、WXP。然后 W98 有 service pack 2 需要考虑,它增加了许多东西,据我记忆。

问 3.18 如何在用户注销时收到通知? [顶部^]
查看 **ISensLogon** 接口。

问 3.19 如何找出我的应用程序当前占用了多少内存(私有字节)? [顶部^]

答:DavidCrow 引用:-

您可以使用性能计数器来实现此目的。类似于

问 3.20 如何判断某个路径或目录是否存在? [顶部^]

答:DavidCrow 引用:-

答:Blake Miller 引用:-

    TCHAR szAvailBytes[256] = TEXT("");
    TCHAR szCacheBytes[256] = TEXT("");
    TCHAR szWorkingSet[256] = TEXT("");
    TCHAR szBuffer[256] = TEXT("");
    DWORD dwBufferSize = sizeof(szAvailBytes);
    HCOUNTER hAvailBytes, hCacheBytes, hWorkingSet;
    HQUERY     hQuery = NULL;
    PDH_COUNTER_PATH_ELEMENTS pdhCpe;
    PDH_STATUS     pdhStatus;
    PDH_FMT_COUNTERVALUE pdhfmtAvail, pdhfmtCache, pdhfmtWorking; 

    pdhStatus = PdhOpenQuery(NULL, 0, &hQuery);
          
    if (pdhStatus == ERROR_SUCCESS)
    { 
       // Make Counter Path 

       pdhCpe.szMachineName = TEXT("crow-nt"); 
     pdhCpe.szObjectName = TEXT("Memory"); 
     pdhCpe.szInstanceName = NULL; 
     pdhCpe.szParentInstance = NULL; 
     pdhCpe.dwInstanceIndex = -1; 
     pdhCpe.szCounterName = TEXT("Available Bytes"); 
     pdhStatus = PdhMakeCounterPath(&pdhCpe, szAvailBytes, &dwBufferSize, 0); 
            
     pdhCpe.szCounterName = TEXT("Cache Bytes"); 
     dwBufferSize =     sizeof(szCacheBytes);
            
     pdhStatus = PdhMakeCounterPath(&pdhCpe, szCacheBytes,&dwBufferSize, 0); 
            
     pdhCpe.szObjectName = TEXT("Process"); 
     pdhCpe.szInstanceName = TEXT("_Total");
     pdhCpe.szCounterName = TEXT("Working Set"); 
     dwBufferSize = sizeof(szWorkingSet); 
            
    pdhStatus =    PdhMakeCounterPath(&pdhCpe, szWorkingSet, &dwBufferSize, 0);
            
     // Add counters. 

            
    pdhStatus = PdhAddCounter(hQuery, szAvailBytes, 0, &hAvailBytes); 
    pdhStatus = PdhAddCounter(hQuery, szCacheBytes, 0, &hCacheBytes); 
    pdhStatus = PdhAddCounter(hQuery, szWorkingSet, 0, &hWorkingSet); 
            
    // Get the data. 
    pdhStatus = PdhCollectQueryData(hQuery);
            
    // Format counter values. 

    pdhStatus = PdhGetFormattedCounterValue(hAvailBytes, PDH_FMT_LONG | PDH_FMT_NOSCALE, NULL, 
            &pdhfmtAvail); 
            
    pdhStatus = PdhGetFormattedCounterValue(hCacheBytes,PDH_FMT_LONG | PDH_FMT_NOSCALE, NULL, &pdhfmtCache); 
            
    pdhStatus = PdhGetFormattedCounterValue(hWorkingSet, PDH_FMT_LONG | PDH_FMT_NOSCALE, NULL, 
            &pdhfmtWorking); 
    
    wsprintf(szBuffer, TEXT("Physical Mem = %ldMB\n"),
    (pdhfmtAvail.longValue + pdhfmtCache.longValue + pdhfmtWorking.longValue) / (1024 * 1024)); 
    pdhStatus = PdhCloseQuery(hQuery);}

伙计,您需要先去这里:-

https://codeproject.org.cn/cpp/cppforumfaq.asp

if( (DWORD)-1 == GetFileAttributes(szFilePath) ){ 告诉您它是否丢失}

ThatsAlok 引用 **:-**[^]

** 尝试 [PathFileExists] API。

Ravi Bhavnani 引用:-

    //! Checks whether a directory exists.
    //! @param     strDirectory Directory
    //! @return true if the directory exists, false otherwise.
            
    bool dirExists (CString strDirectory)
    {
      // Create full directory     specification - return if unable 

      
        TCHAR* fullPath = _tfullpath (NULL,strDirectory, 0); 
        if (fullPath == NULL) 
           return (false); 
        
      // Check if directory exists by trying to make it the default directory 
    
        TCHAR szCurrDir [_MAX_PATH]; 
        _tgetcwd (szCurrDir, _MAX_PATH - 1);
         long nStatus = _tchdir (fullPath); 
    
          _tchdir (szCurrDir); 
    
       // Return free (fullPath);

        if (nStatus == 0) return (true); return (false);
    }

问 3.21 注册表项更改后如何刷新 Explorer 窗口? [顶部^]

答:Michael Dunn 引用:-

查看 [SHChangeNotify()] - 可能有一个标志可以使 Explorer 刷新其视图。

问 3.22 如何确定状态栏的像素高度? [顶部^]

获取状态栏窗口的窗口句柄。然后可以调用 **GetWindowRect**。将矩形的高度作为状态栏的高度。

问 3.23 如何复制文件? [顶部^]

https://codeproject.org.cn/cpp/cppforumfaq.asp

答:Tom Wright 引用:-

尝试 CopyFile 或 CopyFileEx,这是描述。

Tom Archer 引用:-

除了 Tom 所说的,我还建议查看 MakeSureDirectoryPathExists 函数,如果您需要将文件复制到特定的文件夹层次结构。(此函数在 dbghelp.dll 中,您需要根据目标操作系统分发它 -

 BOOL CopyFile
  ( LPCTSTR lpExistingFileName,
    LPCTSTR lpNewFileName,
    BOOL bFailIfExists 
  );
  

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/makesuredirectorypathexists.asp

问 3.24 如何在 VC++ 中旋转 GDI 对象而不使用 setworldtransform? [顶部^]

如果它是一个 DIBSection(即您可以访问位图数据),那么您可以对新的 DIBSection 执行自己的旋转(因为旋转后的图像更大)。

问 3.25 什么是 #pragma pack()? [顶部^]

答:Christian Graus 引用:-

答:Stlan 引用:也许一个简单的例子比任何解释都好。

第一种情况

#pragma pack(1)
struct MyStruct

{
BYTE a;
{
UINT b;
};
};
#pragma pack()


sizeof(struct MyStruct) 将返回 5 字节(1+4=5)。

第二种情况

#pragma pack(4)
BYTE a;
{
UINT b;
};
};
#pragma pack()


sizeof(struct MyStruct) 现在将返回 8 字节!(1+3+4=8),因为编译器将 `MyStruct` 的每个成员对齐到 4 字节边界。具体来说,该指令告诉编译器 `MyStruct` 的每个成员的地址必须是 4 的倍数。为此,编译器会在变量成员之间插入必要的空白字节。

关注点

请继续关注此系列的更多文章,因为 Visual Cpp 论坛日益受欢迎。我必须阅读近 6000 篇帖子才能为本文找到有用/优质的问答,我相信将来也会继续!:) 这确实是一项艰巨的工作,阅读帖子,我现在能体会到 CP 编辑们正在经历什么:)

想法和设计来自 **Michael Dunn** 先生 (MS Visual C++ MVP)Cpp Forum FAQ 文章。

特别感谢

  • 我的父母。
  • 所有活跃的 Visual C++ 论坛/Codeproject 贡献者/成员,因为没有他们,这篇文章就不会问世。
  • Priyank Bolia 负责本文的格式排版:)

历史

2005 年 7 月 31 日:- 根据 Umut Alev 的引用进行的修正 :)这是本文的最后一次更新!
2005 年 6 月 21 日:- 根据 yuhaian 先生的引用进行的链接修正,以及 Stlan Pragma Pack 技巧的添加。
2005 年 6 月 15 日:- 发布 45 天系列的第一篇文章。
2005 年 6 月 13 日:- 开始处理第一篇文章。

[5 月 22 日至 5 月 30 日]

问 4.01 如何在不使用注册表和 MFC 的情况下获取 HDD ID、主板 ID、CDROM 驱动器 ID 等参数? [顶部^]

答:Frank K 引用:-

来自 msdn 的信息:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/computer_system_hardware_classes.asp

问 4.02 如何获得屏幕保护程序已激活的通知? [顶部^]

答:DavidCrow 引用:-

当屏幕保护程序启动时,它会将一个 **WM_SYSCOMMAND** 消息发布到前景窗口,其中 **wParam** 等于 **SC_SCREENSAVE**。

Flit 引用:-

我在 MSDN 上看到了这篇文章,希望它有帮助。HOWTO:知道屏幕保护程序何时启动 ID:Q238882

问 4.03 如何在另一个 .cpp 文件中访问 Doc.h 中声明的变量? [顶部^]

答:Jack Squirrel 引用:-

一篇老文章,但很经典:如何从任何地方获取当前的 CDocument 或 CView http://support.microsoft.com/default.aspx?scid=kb;en-us;108587

问 4.04 如何获取所有可用的时区? [顶部^]

答:ThatsAlok 引用:-

以下 API 将有所帮助:-

EnumTimeFormats
EnumDateFormats
EnumCalendarInfo
EnumUILanguages
更多信息请访问此链接:-
国家语言支持[^]

问 4.05 如何设置工具栏上按钮的文本? [顶部^]

答:PJ Arends 引用:-

向工具栏发送 **TB_SETBUTTONINFO** 消息。

ThatsAlok 引用:-

SetWindowText(HANDLE_OF_BUTTON, BUTTON_TEXT);

问 4.06 如何获取一个 EXE 的主图标,然后用它替换另一个 EXE 的主图标? [顶部^]

答:DavidCrow 引用:-

您的意思是实际修改 .exe 文件吗?如果是这样,请查看 **BeginUpdateResource()** 和 **UpdateResource(..., RT_ICON, ...)。**

问 4.07 如何确保有人登录到计算机? [顶部^]

答:DavidCrow 引用:-

如何使用 NetWkstaUserGetInfo()?

问 3.14 如何捕获用户单击“x”按钮的事件? [顶部^]

如果您使用 **OpenInputDesktop()** 并且它返回 NULL,则表示交互式桌面不可用。即:没有人当前登录或“使用”计算机。

问 4.08 如何访问映射的网络驱动器? [top^]

答:DavidCrow 引用:-

一旦您将驱动器字母映射到网络资源,使用 said 驱动器字母的函数就无法区分。
例如

            FindFirstFile("c:\\*.*", ...);
            FindFirstFile("n:\\*.*", ...);
            

以同样的方式操作。现在如果您正在询问如何建立您的
计算机和远程计算机之间的连接,只需使用 `NetUseAdd()` 或 `WNetAddConnection2()`。

问 4.09 我使用 Visual C++ 6.0 编写了应用程序,如何确定我提供了哪个版本的 MFCxx.dll? [顶部^]

答:ThatsAlok 引用:-

查看此链接:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcconmfcvisualcversionnumbers.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvc60/html/redistribvc6.asp

M. Wohlers 引用:-

使用 **Depends.Exe** 启动您的应用程序。此工具将显示您的程序使用了哪些 DLL。它可以在 Visual 的子目录中找到。

问 4.10 加速键和热键有什么区别? [顶部^]

答:Iain Clarke 引用:-

人们交替使用这两个名称。
热键是加速键的常用用户名称。严格来说...加速键是加速键表的一部分(LoadAccelerator、TranslateAccelerator 等)。它仅在您的应用程序具有键盘焦点时才有效。

热键是全局的键(RegisterHotKey、UnregisterHotKey)。按下时,Windows 会向您发送 WM_HOTKEY 消息。它一直有效。您可以将其用于使某个按键组合执行某个操作,即使您的应用程序被隐藏。(例如,屏幕截图等)。

我不建议一直激活它,因为它可能会与其他应用程序的加速键冲突。

问 3.13 如何找到获取进程所有者用户名(或用户 ID)的方法? [顶部^]

有些人还混淆了其中一个或两个词与“助记键”,即对话框控件上的带下划线字符,允许您使用 <ALT> 键加上带下划线字符的键来聚焦或激活该控件。它们(助记键)也用于顶级菜单和菜单项(尽管当菜单或菜单栏处于活动状态时,您不需要使用 <ALT> 键)。

问 4.11 如何从十进制数中提取整数部分?例如,如果我有 3.13,只取 3? [顶部^]

答:Jack Squirrel 引用:-

   #include<math.h>
                        int nFloor = (int)floor(3.13);
        

DavidCrow 引用:-

    Try: 
          double d = 3.13;
          int n = d;

cmk 引用 :-

来自 MSDN:double modf( double x, double *intptr );


将浮点值分解为小数部分和整数部分。此函数返回 x 的有符号小数部分。没有错误返回。

x:浮点值。intptr:指向存储的整数部分的指针。modf 函数将浮点值 x 分解为小数部分和整数部分,这两者都具有与 x 相同的符号。返回 x 的有符号小数部分。整数部分存储为浮点值,位于 intptr 指向的位置。

问 4.12 如何判断鼠标位置是否在特定行上? [顶部^]

答:Jack Squirrel 引用:-

我使用了这篇文章来进行直线命中测试:**Win32:命中测试直线和曲线,网址为** http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dngdi/html/msdn_hittest2.asp

问 4.13 如何获取控件的类型? [顶部^]

答:Jack Squirrel 引用:-

使用 **GetDlgItem** 获取窗口句柄/对象。使用 **GetClassName** 检索类名/类型。

问 4.14 如何在程序中使用 CSocket 类设置超时值? [顶部^]

答:ThatsAlok 引用:-

[SetSocketOpt]

问 4.15 是否有方法/机制修改当前日期值,使其在 C 运行时库中成为下个月的最后一天? [顶部^]

答:ThatsAlok 引用:-

为此,您需要推导出自己的逻辑。这里有一小段代码可以帮助您入门。

         
        // Get current date 
        time time_t tDateTime; 
        struct tm *pstTM,endDate; 
        int isLeap;
        time(&tDateTime);// Convert to tm structure pstTM= 

        localtime(&tDateTime); 
        
        printf("\nToday-%d/%d/%d",pstTM->tm_mday,pstTM->tm_mon+1,pstTM->tm_year+1900);
        
        //Check is Year is Leap? 
        if(pstTM->tm_year%4) isLeap=1; else isLeap=0; 
        
        endDate=*pstTM; 
        //Now start putting Modified date

         // Check for February 
        
            if(endDate.tm_mon==1)
            {
             if(isLeap)
              endDate.tm_mday=29; 
             else
              endDate.tm_mday=28; 
            } 
            else

             {
              //Now For 31 days Month 
                  if(((!(pstTM->tm_mon%2))&&(pstTM->tm_mon<=6)) 
            ||((pstTM->tm_mon%2))&&(pstTM->tm_mon>=7))
              endDate.tm_mday=31; 
            else

              //for Thirty Day Month 
              endDate.tm_mday=30;
               }
               
printf("\nModified Date: %d/%d/%d" ,endDate.tm_mday,endDate.tm_mon+1,endDate.tm_year+1900);
            

Neville Frank 引用:-

如果您正在使用 Boost,我建议您使用 boost:date,它使用 ISO 8601。请参阅:https://boost.ac.cn/doc/html/date_time.htmlhttp://www.cl.cam.ac.uk/~mgk25/iso-time.html

Toni78 引用:-

当您想从一个时间段跳转到另一个时间段时,difftime 可能非常有用。我以前在编写房间预订软件时经常使用它。

问 4.16 如何以编程方式建立 Windows 拨号连接? [顶部^]

答:ThatsAlok 引用:-

http://msdn.microsoft.com/library/en-us/wininet/wininet/establishing_a_dial_up_connection_to_the_internet.asp

问 4.17 如何在基于对话框的应用程序中裁剪图像? [顶部^]

答:Christian Graus 引用:-

显而易见的方法是创建一个新的位图,并使用 **BitBlt** 复制您需要的位。矩形部分很简单,只需在鼠标位置绘制矩形,并在 onmousemove 中跟踪位置。

问 4.18 如何加载其参数仅在运行时才知道的 DLL 函数? [顶部^]

答:munawar1968 引用:-

嗨,请查看“Smashing the Stack for fun and profit”,作者是 Aleph One。这是关于理解堆栈操作的精彩文档,包含大量代码片段。http://www.phrack.org/phrack/49/P49-14.hi

[5 月 31 日至 6 月 8 日]

问 5.01 如何移除窗口的关闭按钮? [顶部^]

答:Bob Stanneveld 引用:-

我认为没有简单的方法可以移除关闭按钮,因为它属于系统菜单。您可以使用 GetSystemMenu() 来禁用它。

您也可以移除整个标题栏。但请告诉我您为什么要移除关闭按钮?用户会对此非常恼火!。

Stlan 引用:-

试试这个:GetSystemMenu(FALSE)->EnableMenuItem(SC_CLOSE, FALSE);

问 5.02 如何更改编辑控件的前景色和背景色? [顶部^]

答:ThatsAlok 引用:-

查看这些 API [SetTextColor]、[SetBkColor]。

问 5.03 RC 文件的结构是什么? [顶部^]

答:Tom Archer 引用:-

RC 编译器语法:- http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tools/tools/resource_definition_statements.asp

问 5.04 如何在任务栏右角附近创建一个弹出消息? [顶部^]

问 3.22 如何确定状态栏的像素高度? [顶部^]

我知道我在这里看到过关于这个主题的文章,搜索“(taskbar OR tray) notification window”之类的词语。(顺便说一句,MS 将这种弹出风格称为“toast”,就像从烤面包机里蹦出来的吐司一样。)

Giorgi Moniava 引用:-

也许这对您有帮助:- https://codeproject.org.cn/dialog/taskbarnotifier.asp

问 5.05 如何在 Visual C++ 中制作安装程序? [顶部^]

答:ThatsAlok 引用:-

免费安装程序制作工具!

http://www.jrsoftware.org/isinfo.php

或者如果您在寻找源代码:-

https://codeproject.org.cn/tips/installbuilder.asp
https://codeproject.org.cn/tools/EasyInstaller.asp

问 5.06 如何在运行时将文本文件转换为 BMP? [顶部^]

答:PJ Arends 引用:-

加载(或创建)位图,将其选入内存 DC,然后使用 DrawText 或 TextOut 将您的文本绘制到位图上,就像您在屏幕 DC 上绘制文本一样。将位图从 DC 中选出并保存。

问 5.07 如何直接或通过 LAN 获取连接到 PC 的默认打印机? [顶部^]

答:PJ Arends 引用:-

查看 CWinApp::GetPrinterDeviceDefaults()。

Nilesh K. 引用:-

查看 EnumPrinters API,这应该能让您获取可用的打印机。

问 5.08 如何以编程方式更改 IE 中当前加载的 HTML? [顶部^]

答:ThatsAlok 引用:-

此链接将有所帮助:- http://msdn.microsoft.com/library/en-us/dnwebgen/html/bho.asp

问 5.09 如何在没有安装 MS Access 的 PC 上使用 MS Access 2000 创建的数据库? [顶部^]

答:Michael P Butler 引用:-

很遗憾,您不能。Access 表单需要安装 MS Access(或至少是 Access Runtime)。如果您有正确的许可证,可以重新分发 MS Access Runtime。

问 5.10 MFC 的 DeflateRect 的 SDK 函数是什么? [顶部^]

答:Stlan 引用:-

SDK 中没有对应的函数。实际上,如果您查看 CRect::DeflateRect 的定义,您会发现它通过对参数取反来调用 `::InflateRect`。

ThatsAlok 引用:-

没有可用的 SDK,您必须自己实现。这里有一个小逻辑可以帮助您:-

 void MyDeflate(RECT *rect,int left,int top,int right,int bottom) 
 {
       rect->bottom-=bottom;
       rect->right-=right;
       rect->top+=top; 
       rect->left+=left; 
 } 
 void MyDeflate(RECT *rect,SIZE size) 
 {
  MyDeflate(rect,size.cx,size.cy); 
 } 
 
 void MyDeflate(RECT *rect,int x, int y) 
 { 
    MyDeflate(rect,x,x,y,y); 
 }


问 5.11 如果我给当前日期增加 100 天,如何得到修改后的日期? [顶部^]

答:cedric moonen 引用:-

假设今天是“2005-6-2”,如果我加上 100 天,结果是

CTime Time(2005,6,2,0,0,0); // Look in the doc for the "daylight savings time" 

        //    that you want to use
CTimeSpan Span(100,0,0,0);
CTime NewTime = Time + Span; // NewTime will hold the time you are looking for
    

问 5.12 如何将图像文件通过套接字发送? [顶部^]

答:Trollslayer 引用:-

CSocketFile 可能会起作用,可以读写两端的文件。

ThatsAlok 引用:-

如果您使用的是 RAW 套接字,请将整个图像文件读取到 STRING 中,然后将其发送到连接的套接字到另一端。这确实有效!我的一个项目使用了类似的逻辑!

问 5.13 我的服务在与服务管理器交互时,如何模拟管理员(服务可以访问登录信息)? [顶部^]

https://codeproject.org.cn/cpp/cppforumfaq.asp

任何信息...
调用 LogonUser 获取令牌句柄。
使用令牌句柄调用 ImpersonateLoggedOnUser。
...执行您的特殊操作...
调用 RevertToSelf 返回到您的原始身份。

问 5.14 是否有 SDK 函数可以将大缓冲区从大端序转换为小端序?[顶部^]

答:RichardS 引用:-

我不知道有 SDK 可以做到这一点,但切换端序并不难。您可以这样做:-

typedef struct _tagByteBreak
{

unsigned char bUpperByte;
unsigned char bMiddleByte1;
unsigned char bMiddleByte2;
unsigned char bLowerByte;
} BYTE_BREAK;


typedef union _tagEndianSwitch
{
BYTE_BREAK stBreak;
unsigned long int ulFull;
} ENDIAN_SWITCH;

void UTIL_SwitchEndian (unsigned long int *pulIn)
{
ENDIAN_SWITCH Endian;

unsigned char btemp;

Endian.ulFull = *pulIn;

btemp = Endian.stBreak.bLowerByte;
Endian.stBreak.bLowerByte = Endian.stBreak.bUpperByte;
Endian.stBreak.bUpperByte = btemp;
btemp = Endian.stBreak.bMiddleByte1;
Endian.stBreak.bMiddleByte1 = Endian.stBreak.bMiddleByte2;
Endian.stBreak.bMiddleByte2 = btemp;

*pulIn = Endian.ulFull;
}

此代码接受一个无符号长整型(32 位)并交换其端序(任意方向)。现在您只需要一个循环。

void ConvertEndian (unsigned long int szLen, unsigned long int *pulBuf) 
{ 
 for (unsigned long int i = 0; i < szLen; ++i) 
 {
  UTIL_SwitchEndian (&pulBuf[i]); 
 } 
}        
            


这将把缓冲区转换为相反的字节序系统。修改为 16 位应该很容易。

问 5.15 如何将十六进制转换为二进制? [顶部^]

答:RichardS 引用:-

您想如何存储二进制?所以您想要一个读作“0110 1111 1100 1001”的字符串?或者它是否在 16 位变量中?关于交换字节,将字节存储在数组 achOrig 中,

然后只需按位移位:s

hort int w16Bits = (achOrig[0] << 8) | achOrig[1];

现在您将拥有 w16Bits = 6F C9(在内存中)

问 5.16 如何以编程方式检查剪贴板中的文本? [顶部^]

答:Ravi Bhavnani 引用:-

请参阅这篇 CP 文章 和这篇 MSDN 文章

问 5.17 如何以编程方式知道网络摄像头已连接到 USB 端口? [顶部^]

答:FlyingTinman 引用:

如果网络摄像头安装了有效的驱动程序,您只需要枚举连接的视频设备并查找与您的网络摄像头匹配的“友好名称”。

请查看 AMCAP 源代码(在 DirectShow SDK 示例中)了解如何执行此操作。AMCAP 枚举所有连接的视频设备并在菜单中列出它们的“友好名称”,用户可以从中选择一个。

问 5.18 如何在没有电子邮件帐户的情况下从我的程序发送电子邮件? [顶部^]

答:cadi 引用:

当然是可能的。有两种发送电子邮件的方法

  1. 使用中继服务器。如果您选择此选项,您需要一个不需要身份验证的 SMTP 服务器。您可以使用 Microsoft IIS 中的 SMTP 服务器。
  2. 直接发送给收件人。只需对电子邮件地址进行 MX DNS 查找,然后通过端口 25 上的 SMTP 直接将邮件发送到收件人的邮件服务器。然后您需要创建一个要发送的邮件的 MIME 消息。(为此请参阅 rfc 822)。然后您需要递送邮件。

同样有两种选择

  1. 如果您使用 IIS 的 SMTP 服务器(或任何其他支持下拉目录的服务器),您可以将消息简单地保存到邮件服务器的下拉目录(C:\Inetpub\smptroot\pickup)。SMTP 服务器将排队等待邮件并将其发送给收件人。
  2. 在端口 25 上打开到收件人邮件服务器的连接,发送 HELO 等等…… MIME 邮件和 SMTP 协议的实现细节将远远超出论坛的范围。

但据我所记得,在这两个问题上都有很好的文章,例如 https://codeproject.org.cn/tips/CSMTPConnection2.asp

问 5.19 如何通过窗口消息发送数据/UDT? [顶部^]

答:Tom Archer 引用:-

发送消息时,将值转换为 WPARAM 和 LPARAM,然后在消息处理程序中将它们转换回来。

 // sending 
 TCHAR* pszValue = _T("abc"); 
 int iValue = 42;
 SendMessage(hwnd, MY_WM_MESSAGE1, (WPARAM)pszValue,(LPARAM)iValue); 
 
 // receiving LONG CYourClass::OnMessage1(WPARAM wp, LPARAM lp) 

 {
   TCHAR* psz = (TCHAR*)wp;
   int i = (int) lp;
  }

Jack Squirrel 引用:

CString* pString = new CString(_T("Text"));
int nNumber = 100;
PostMessage(hMyWnd, MY_WM_MESSAGE1, reinterpret_cast<WPARAM>(pString), 
reinterpret_cast<LPARAM>(nNumber)); 

字符串必须在堆上分配,否则它在超出范围时会崩溃。您需要在收到 OnMyMessage1 时释放其内存。在 OnMyMessage1 中...
CString* pString = reinterpret_cast<CSTRING*>(wParam);
int nNumber = reinterpret_cast<INT>(lParam);
...delete pString;

Rouslan Grabar [Russ] 引用:

是的,正如其他人刚建议的那样,您可以将您的 int 和 string 分别转换为 wparam 和 lparam。但是,如果您以后需要传递比两个变量更多的信息怎么办?我建议声明一个结构,其中包含您需要与消息一起传递的任何信息。这有一个长期的好处——如果代码将来需要调整,调整不会影响函数签名和应用程序的体系结构。

 struct MYMESSAGEDATA 
  {
   int nInteger; 
   char* nString; // add here anything you want later 

   // e.g. status flags, length of a string, etc.
   }; ... ... MYMESSAGEDATA* 
 
  pData = new MYMESSAGEDATA; 
  pData->nInteger = 1;
  pData->nString = "string"; 
  
  ... ... ::SendMessage(hwnd, msg, NULL, (WPARAM)pData); 
  ... LRESULT CProvaDlg::OnMyMessage1(WPARAM wParam, LPARAM lParam) 
  {  // cast lprama back to our message data 
  
  MYMESSAGEDATA* pIncomingData = (MYMESSAGEDATA*)lParam; 
  //do     what ever you need ... ...

   //deallocate memory 
   delete pIncomingData; 
   return 0; 
  }
 
正如您在上面的示例中看到的,您有一个备用的 wParam,可用于传递,例如,消息发送者的 ID,将其视为此方法的另一个优点。

问 5.20 如何获取通过 NIC(标准以太网卡)接收/发送的字节/数据包数量? [顶部^]

答:ThatsAlok 引用:-

查找 IPHelper API 或 http://www.winpcap.org/

S.Gopalakrishnan 引用:

您好,

您还可以使用 WMI(Windows Management Intruments)对象进行此监视。它提供了功能,对象方面。它易于使用和工作。请在 MSDN 中查看 Win32_NetworkAdapterConfiguration 部分。它将对您大有帮助。

问 5.21 谁能给我介绍一下 RAW DATABASE 格式? [顶部^]

答:DavidCrow 引用:-

你见过这个吗? http://www.wotsit.org/search.asp?s=database

问 5.22 如何在 MDI 结构中检查当前文档是否正在关闭? [顶部^]

答:S.Gopalakrishnan 引用:

你好,没有直接的方法可以做到这一点。创建您自己的派生自 CDocument 的类并覆盖此方法。

virtual void OnCloseDocument();

liquid_ 引用:

我建议通过设置 CDocument 的成员(例如,bool closing)在您的 OnCloseDocument 覆盖的开头来完成此操作,并在函数末尾取消设置它。

问 5.23 串行通信程序中 EV_BREAK 事件检测的先决条件是什么? [顶部^]

答:Bob Stanneveld 引用:-

你好,连接丢失时不会引发 EV_BREAK 事件。您应该尝试 EV_ERR 事件。请参阅 此处[^] 了解有关串行事件的更多信息。

断点是一些特殊操作,某些设备通过网络发送。它有时用于确定哪个设备允许发送数据。

问 5.24 如何从 C++ 代码中获取 DPI 值? [顶部^]

答:DavidCrow 引用:-

GetDeviceCaps() 的文档中明确指出,可以使用 LOGPIXELSXLOGPIXELSY 来获取特定设备的每英寸像素数。此外,GetSystemMetrics() 的文档显示,可以使用 SM_CXSCREENSM_CYSCREEN 来获取屏幕的宽度和高度(以像素为单位)。

问 5.25 是否有简单的方法可以使我的程序的 Exe 在调试版本和发布版本中显示不同的图标? [顶部^]

https://codeproject.org.cn/cpp/cppforumfaq.asp

如果您使用的是 Visual Studio 6.0,它有一个专门用于设置资源编译器设置的选项卡。
请参阅项目设置对话框:资源选项卡:预处理器定义编辑字段。所以,我的一个项目,

例如,调试版本已经定义了 _DEBUG。在您的 RC 或 .RC2 文件中,做类似这样的事情

#ifdef _DEBUG 
1 ICON "MyDebug.Ico"
#else 
1 ICON     "MyRelease.Ico" 
#endif 
            

看看是否对您有效。我可能会将其放入 RC2 文件中,因为资源编辑器通常会对“意外”的预处理器语句报错。

问 5.26 有什么办法可以处理任务管理器强制退出应用程序的情况吗? [顶部^]

答:Bob Stanneveld 引用:-

据我所知,您无法阻止任务管理器终止您的应用程序。原因是任务管理器终止应用程序的方式。TM 通过清理进程的所有资源来实现此目的(就像正常终止一样,但没有通知)。

我来详细说明一下:Windows 管理分配给进程/线程的 CPU 时间,并使用特定的队列。如果进程能够运行(准备运行,R2R),它会等待队列直到获得 CPU 时间。如果进程/线程被阻塞,它会等待其他地方,直到它变为 R2R。获得该状态后,它会被放入队列。任务管理器从该系统中删除进程句柄,因此进程将不再获得任何 CPU 时间。

完成此操作后,Windows 将清理该进程使用的所有资源(尽其所能)。因此,您的进程会在没有任何通知的情况下消失。希望这有帮助

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/makesuredirectorypathexists.asp

这里有一些有趣的阅读材料,可以帮助您了解正在发生的事情
http://blogs.msdn.com/oldnewthing/archive/2004/07/22/191123.aspx#191459
http://blogs.msdn.com/oldnewthing/archive/2004/07/23/192531.aspx

问 5.27 如何在 VC++ 中确定计算机的名称? [顶部^]

答:ThatsAlok 引用:-

[GetComputerName]

DavidCrow 引用:-

另一种方法是 gethostname()

问 5.28 如何运行时更改复选框控件的位置? [顶部^]

答:ThatsAlok 引用:-

如何 [MoveWindow] 和 [SetWindowPos] API!

问 5.29 调用 SHBrowseForFolder 函数时如何显示隐藏文件夹? [顶部^]

答:Mark Petrik Sosa 引用:

据他们说:http://groups-beta.google.com/group/microsoft.public.vc.mfc/browse_thread/thread/6beca664725eb48a/af56d62d17b9d4e8

SHBrowseForFolder 不会显示隐藏文件夹。

问 5.30 如何将 UNICODE 数据转换为 Ascii? [顶部^]

答:Jack Squirrel 引用:-

Win32

  • WideCharToMultiByte => Unicode 到 ANSI
  • MultiByteToWideChar => ANSI 到 Unicode

如果您使用的是 MFC 7.1

  • CStringW strUnicode = L"Blah"; CStringA strANSI(strUnicode);
  • CStringW = Unicode 字符串 CStringA = ANSI 字符串

ThatsAlok 引用:-

接续 Jack 先生:

  1. wcstombs(将宽字符转换为多字节字符),mbstowcs(正好相反)
  2. 字符串转换宏 W2T、T2BSTR 等,请在此处查看完整列表 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_atl_string_conversion_macros.asp

历史 

2005 年 7 月 21 日:Umut Alev 先生引用的更正 :) 这是对本文的最后更新!
2005 年 6 月 21 日:链接更正(由 yuhaian 先生引用)加上 Stlan Pragma Pack 提示
2005 年 6 月 15 日:发布了 45 天系列的第一个文章
2005 年 6 月 13 日:- 开始处理第一篇文章。

© . All rights reserved.