45 天系列:Codeproject VC++ 论坛问答 - IV
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 如何限制我的应用程序只运行一个实例? [顶部^]
答:许多人引用:-
- http://flounder.com/nomultiples.htm
- https://codeproject.org.cn/threads/singleinstancemfc.asp
- https://codeproject.org.cn/cpp/csingleinst.asp
问 2.05 如何使用 nmake? [顶部^]
答:PJ Arends 引用:-
问 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 如何在不结束字符串的情况下在文本字符串中包含“? [顶部^]
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/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 引用:-
- https://codeproject.org.cn/dotnet/ManifestInjection.asp
- https://codeproject.org.cn/w2k/makexp.asp
- ManifestMacro.asp
- https://codeproject.org.cn/cpp/xpstylemfc.as
[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 引用:-
您可以阅读这里:-
- http://support.microsoft.com/default.aspx?scid=kb;en-us;190351
- http://msdn.microsoft.com/library/en-us/dllproc/base/creating_a_child_process_with_redirected_input_and_output.asp
问 3.04 如何使用 Win32 API 在状态栏中添加进度条? [顶部^]
答:Jack Squirrel 引用:-
问 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**。将矩形的高度作为状态栏的高度。
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 引用:-
问 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/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.html 和 http://www.cl.cam.ac.uk/~mgk25/iso-time.html
Toni78 引用:-
当您想从一个时间段跳转到另一个时间段时,difftime 可能非常有用。我以前在编写房间预订软件时经常使用它。
问 4.16 如何以编程方式建立 Windows 拨号连接? [顶部^]
答:ThatsAlok 引用:-
问 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 引用:-
问 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 引用:-
问 5.17 如何以编程方式知道网络摄像头已连接到 USB 端口? [顶部^]
答:FlyingTinman 引用:
如果网络摄像头安装了有效的驱动程序,您只需要枚举连接的视频设备并查找与您的网络摄像头匹配的“友好名称”。
请查看 AMCAP 源代码(在 DirectShow SDK 示例中)了解如何执行此操作。AMCAP 枚举所有连接的视频设备并在菜单中列出它们的“友好名称”,用户可以从中选择一个。
问 5.18 如何在没有电子邮件帐户的情况下从我的程序发送电子邮件? [顶部^]
答:cadi 引用:
当然是可能的。有两种发送电子邮件的方法
- 使用中继服务器。如果您选择此选项,您需要一个不需要身份验证的 SMTP 服务器。您可以使用 Microsoft IIS 中的 SMTP 服务器。
- 直接发送给收件人。只需对电子邮件地址进行 MX DNS 查找,然后通过端口 25 上的 SMTP 直接将邮件发送到收件人的邮件服务器。然后您需要创建一个要发送的邮件的 MIME 消息。(为此请参阅 rfc 822)。然后您需要递送邮件。
同样有两种选择
- 如果您使用 IIS 的 SMTP 服务器(或任何其他支持下拉目录的服务器),您可以将消息简单地保存到邮件服务器的下拉目录(C:\Inetpub\smptroot\pickup)。SMTP 服务器将排队等待邮件并将其发送给收件人。
- 在端口 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;
是的,正如其他人刚建议的那样,您可以将您的 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/
您好,
您还可以使用 WMI(Windows Management Intruments)对象进行此监视。它提供了功能,对象方面。它易于使用和工作。请在 MSDN 中查看 Win32_NetworkAdapterConfiguration 部分。它将对您大有帮助。
问 5.21 谁能给我介绍一下 RAW DATABASE 格式? [顶部^]
答:DavidCrow 引用:-
你见过这个吗? http://www.wotsit.org/search.asp?s=database
问 5.22 如何在 MDI 结构中检查当前文档是否正在关闭? [顶部^]
你好,没有直接的方法可以做到这一点。创建您自己的派生自 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() 的文档中明确指出,可以使用 LOGPIXELSX 和 LOGPIXELSY 来获取特定设备的每英寸像素数。此外,GetSystemMetrics() 的文档显示,可以使用 SM_CXSCREEN 和 SM_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 引用:
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 先生:
- wcstombs(将宽字符转换为多字节字符),mbstowcs(正好相反)
- 字符串转换宏 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 日:- 开始处理第一篇文章。