45 天系列:CodeProject VC++ 论坛问答 - V
VC++ 论坛的问答集合。
引言
没什么特别的……这篇文章是Code Project Visual C++ 论坛上提出的问题和答案的汇编。同时,这也是45天系列的第三篇文章。我希望,我能带来更多这个系列的文章。
感谢那些在CodeProject论坛上贡献力量,帮助同行解决问题的人们。我修改了一些原始评论以适应/保持文章的观感(对此我深表歉意)。如果我遗漏了什么,请随时给我发邮件或在下方留言。
Content
MFC |
|
MFC01 | 如何将整数、浮点数转换为CString? |
MFC02 | 如何在MFC中比较位图图像? |
MFC03 | 如何从应用程序本身跟踪应用程序内存使用情况? |
MFC04 | OnClose()、OnDestroy() 和 DestroyWindow() 之间有什么区别? |
MFC05 | 如何设置静态文本的字体大小? |
MFC06 | 如何在VC++(MFC)中创建Web服务器? |
MFC07 | 如何从dd/mm/yyyy格式的日期中查找星期几的名称? |
MFC08 | 为什么CWinApp类只有一个对象? |
MFC09 | 如何在屏幕上打印透明值? |
MFC10 | 如何从现在可用的秒数计算未来日期? |
WINDOW32 |
|
Win3201 | 如何在Window Vista中以编程方式获取路径(C:\Users\Public)? |
Win3202 | DLL中的名称修饰是如何工作的? |
Win3203 | 我可以用渐变色填充我的移动对话框、气泡对话框吗? |
Win3204 | 如何在C/C++中更改当前工作目录? |
Win3205 | 如何获取我的硬盘名称及其所有相关信息? |
Win3206 | 如何获取我的域中所有用户的登录名? |
Win3207 | 如何获取临时文件夹路径? |
Win3208 | 将CString转换为标准C++字符串最简单的方法是什么? |
Win3209 | 如何获取Win CE设备的名称? |
Win3210 | 如何捕获Windows关机(或休眠)事件以及禁用它的方法? |
Win3211 | 如何使用C++检查注册表项是否存在? |
Win3212 | 如何创建共享文件和文件夹? |
Win3213 | 坐标是客户区坐标,但如果窗口正在滚动则不正确。我该怎么办? |
Win3214 | 如何使用Rundll32.exe运行dll? |
Win3215 | 如何检测用户的用户界面语言? |
Win3216 | 如何检查进程内存使用情况? |
通用 |
|
GEN01 | 如何从C++调用外部.js文件中的函数? |
GEN02 | 如何获取一年的总天数(无论是365天还是366天)? |
GEN03 | 如何开发Windows系统启动应用程序? |
GEN04 | 如何在VS2005中部署可执行文件? |
GEN05 | 如何获得XP风格外观? |
GEN06 | 如何将十六进制格式转换为人类可读的值? |
GEN07 | 程序如何检测本地计算机是否连接到网络? |
GEN08 | 我想构建通过USB端口通信的应用程序。如何开始? |
GEN09 | 如何设置应用程序或dll的有效期? |
GEN10 | 访问NULL指针而不崩溃? |
GEN11 | 如何声明和初始化从一个dll导出并在各种文件中使用的全局变量? |
GEN12 | 如何将包含嵌入式NULL字符的char数组转换为BSTR? |
GEN13 | 如何从非托管代码调用.NET托管DLL? |
GEN14 | 如何在编译时获取项目名称? |
GEN15 | 如何检测指针是指向栈还是堆? |
GEN16 | 是否可以在C++中创建NFS挂载? |
GEN17 | #pragma once 的意义是什么? |
GEN18 | CWebBrowser2如何使用代理? |
GEN19 | Vista权限提升问题? |
GEN20 | 如何从蓝牙读取数据? |
有趣 |
|
FUN01 | 如何扫描或识别空白可写CD上的物理损坏(如划痕或斑点)? |
FUN02 | 如何在应用程序关闭后显示消息框? |
FUN03 | 关于多态性的轻松一面! |
答案 |
|
MFC |
|
问题(MFC01) | 如何将整数、浮点数转换为CString?[顶部] |
答案 | 在ANSI中:-CStringA strFormat; // For Integer strFormat.Format("%d",10); // For Float strFormat.Format("%f",10.05);在Unicode中:- CStringW strFormat; // For Integer strFormat.Format(L"%d",10); // For Float strFormat.Format(L"%f",10.05); |
问题(MFC02) | 如何在MFC中比较位图图像?[顶部] |
完整问题 | 假设我有两个bmp文件:- 1包含字母AB,2包含字母AC。 现在我想检查如何通过比较第一个(A-A & A-C)和(A-A & A-B)来比较这两个图像。 一旦发现A-C或A-B,它应该给出错误消息,说明图像不相同。 那么如何在MFC中执行这项独特的工作呢? |
答案 | 答案#1 如果你想了解图像处理,请尝试进行谷歌搜索。互联网上已经有大量关于该主题的资源。"http://en.wikipedia.org/wiki/Digital_image_processing" rel="nofollow">数字图像处理[^] 答案#2 |
问题(MFC03) | 如何从应用程序本身跟踪应用程序内存使用情况?[顶部] |
答案 | 建议#1:使用GlobalMemoryStatus() 建议#2:尝试使用 CMemoryState类 。它只在调试版本中有效。您还可以在函数之前和之后使用GetProcessMemoryInfo() API。 |
问题(MFC04) | OnClose()、OnDestroy() 和 DestroyWindow() 之间有什么区别?[顶部] |
答案 | 当您单击关闭按钮(或按Alt+F4 或以其他方式关闭窗口)时,会发送WM_CLOSE 。通常,您会进行一些清理,然后调用DestroyWindow() 。如果您让DefWindowProc 处理WM_CLOSE ,它将为您调用DestroyWindow() 。WM_DESTROY 通知您窗口正在被销毁。 |
问题(MFC05) | 如何设置静态文本的字体大小?[顶部] |
答案 | 您可以使用。CFont *m_Font1 = new CFont(); CStatic *staticCtl =(CStatic *) GetDlgItem(IDC_STATIC1); m_Font1->CreatePointFont(100,_T("Arial")); staticCtl->SetFont(m_Font1); |
问题(MFC06) | 如何在VC++(MFC)中创建Web服务器?[顶部] |
答案 | 建议#1 从HTTP 1.0开始,该协议实现起来相当简单(与HTTP 1.1相比)。 http://ftp.ics.uci.edu/pub/ietf/http/rfc1945.html 建议#2 这是一篇非常古老(约1996年)的文章,描述了如何使用MFC编写HTTP/1.0服务器:“使用MFC和Windows Sockets编写一个简单的基于HTTP的服务器”,作者Dave Cook,发表于1996年2月期的Microsoft Systems Journal,网址为http://www.microsoft.com/msj/archive/S25F.aspx |
问题(MFC07) | 如何从dd/mm/yyyy格式的日期中查找星期几的名称?[顶部] |
答案 | 以下代码会有所帮助COleDateTime dt("9/24/2008"); CString dayNameLong = dt.Format("%A"); CString dayNameShort = dt.Format("%a"); |
问题(MFC08) | 为什么CWinApp类只有一个对象?[顶部] |
答案 | 答案1
因为MFC就是这样设计的。这个对象封装了所有Windows应用程序只有一个的应用程序实例信息,例如HINSTANCE和传递的命令行参数。它还保存了任何其他只能有一个的应用程序范围的设置。这使得它成为一个很好的地方来隐藏应用程序范围的变量,这些变量在过去是全局变量。 答案2因为它应用程序类的基类。一个应用程序不需要多个应用程序类。实现依赖于从 “MFC中的主应用程序类封装了Windows操作系统的应用程序的初始化、运行和终止。基于该框架构建的应用程序必须且只能有一个从CWinApp派生的类的对象。”引自msdn。 |
问题(MFC09) | 如何在屏幕上打印透明值?[顶部] |
完整问题 | 如何在屏幕顶部显示一个值。我有一个图片框……图片窗口上有一张图片。现在我需要在图片上显示一个值,但这个控件必须是透明的。如何实现? |
答案 | 请按以下方式尝试。(m_pic.GetDC())->SetBkMode(TRANSPARANT); (m_pic.GetDC())->TextOut(0,0,"hello");希望这能奏效。 |
问题(MFC10) | 如何从现在可用的秒数计算未来日期?[顶部] |
答案 | 以下代码将帮助您从当前日期计算未来日期CTimeSpan sPan(0,0,0, 86400 );// 1 day CTime CurTime = CTime::GetCurrentTime(); CurTime +=sPan; CString csTime = CurTime.Format(_T("%A, %B %d, %Y")); AfxMessageBox(csTime ); |
WINDOW32 |
|
问题(WIN3201) | 如何在Window Vista中以编程方式获取路径(C:\Users\Public)?[顶部] |
完整问题 | 我需要在c:\Users\Public下创建一个目录。我的操作系统是Vista。我正在使用VC++。我不能使用最新的SDK。我能否知道如何使用VC++6.0以编程方式获取该路径 |
答案 | 标准方法是使用SHGetKnownFolderIDList()[^]函数,将REFKNOWNFOLDERID作为FOLDERID_Public传递。此函数仅在Vista中可用,在您无法安装最新SDK的情况下,您必须从shell32.dll动态加载该函数。 但是我认为下面的代码也有效(我没有测试它,因为我现在没有Vista) TCHAR tcPath[MAX_PATH];
GetEnvironmentVariable( _T("PUBLIC"), tcPath, MAX_PATH );
|
问题(WIN3202) | DLL中的名称修饰是如何工作的?[顶部] |
完整问题 | 我认为extern C足以防止名称被修饰,但是当我们使用dllexport从DLL导出函数名时,即使我们同时用extern C声明,但如果没有DEF文件来定义未修饰的导出函数名,名称仍然被修饰。 我不知道为什么需要DEF文件?extern C不足以控制DLL导出名称和当前DLL模型链接的名称修饰吗? |
答案 | 我认为这不完全正确。C函数也会根据调用约定进行修饰。 请参阅:http://msdn.microsoft.com/en-us/library/x7kb4e2f.aspx[^] 例如;在 .cpp 中 extern "C" { __declspec(dllexport) int MyFunc ( int A ) { return(A*2); } } and in .def (in EXPORTS): MyFunc @3 'DumpBin /exports mydll.lib' will report '_MyFunc' as the name. If, we used: extern "C" { __declspec(dllexport) int __stdcall MyFunc ( int A ) { return(A*2); } } 那么,即使有 .def 条目,dumpbin 也会将 '_MyFunc@4' 报告为名称 默认的 _cdecl 是标准,_ 前缀被所有厂商使用。 其他调用约定是厂商特定的(__stdcall 我认为是微软独有的)。 当您想用一个编译器创建 DLL,并希望它能被任何其他编译器编译的 EXE 调用时,请使用 extern "C" {} _和_ 默认的 _cdecl。 如果您有一个 .cpp 文件,所有函数将使用 C++ 命名——经过修饰。如果您有一个 .c 文件,所有函数将使用 C 命名——按照我之前消息中发布的 URL 描述进行修饰。默认的 _cdecl .c 命名被大多数人认为是未修饰的,尽管它有(前导 _)。 在 .cpp 文件中使用 extern "C",或在 .c 文件中使用 extern "C++",只是允许您根据文件扩展名(.c 或 .cpp)覆盖编译器使用的默认命名。 在你的 dumpbin 输出中,MyFunc1 _是_ 被修饰的 (_MyFunc)。默认情况如此标准,以至于 _ 经常从显示中省略——但它确实存在。 |
问题(WIN3203) | 我可以用渐变色填充我的移动对话框、气泡对话框吗?[顶部] |
答案 | 比如说我有一个位于屏幕50,50处的10x10矩形,函数需要 RECT gradRect = {0,0, 10,10} 而不是 RECT gradRect = {50, 50, 60, 60},这和你预期的不一样。很抱歉造成了混淆。 至于bool isVerticle参数,您可以从左到右或从上到下运行渐变。 isVerticle = true ---> 从上到下渐变 isVerticle = false ---> 从左到右渐变 这是一个45秒的例子。您需要链接gdi32、user32和kernel32。 不用猜我用了哪个IDE ![]() #include <windows.h> /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "CodeBlocksWindowsApp"; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default colour as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Code::Blocks Template Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, nCmdShow); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } // frees you from using the GDI function, which requires a region void GradientFillRect(HDC hdc, LPRECT rcGradient, COLORREF start, COLORREF end, BOOL isVertical) { BYTE startRed = GetRValue(start); BYTE startGreen = GetGValue(start); BYTE startBlue = GetBValue(start); BYTE endRed = GetRValue(end); BYTE endGreen = GetGValue(end); BYTE endBlue = GetBValue(end); HBRUSH endColor = CreateSolidBrush(end); FillRect(hdc, rcGradient, endColor); DeleteObject(endColor); //Gradient line width/height int dy = 1; int length = (isVertical ? rcGradient->bottom - rcGradient->top : rcGradient->right - rcGradient->left) - dy; for (int dn = 0; dn >= length; dn += dy) { BYTE currentRed = (BYTE)MulDiv(endRed-startRed, dn, length) + startRed; BYTE currentGreen = (BYTE)MulDiv(endGreen-startGreen, dn, length) + startGreen; BYTE currentBlue = (BYTE)MulDiv(endBlue-startBlue, dn, length) + startBlue; RECT currentRect = {0}; if (isVertical) { currentRect.left = rcGradient->left; currentRect.top = rcGradient->top + dn; currentRect.right = currentRect.left + rcGradient->right - rcGradient->left; currentRect.bottom = currentRect.top + dy; } else { currentRect.left = rcGradient->left + dn; currentRect.top = rcGradient->top; currentRect.right = currentRect.left + dy; currentRect.bottom = currentRect.top + rcGradient->bottom - rcGradient->top; } HBRUSH currentColor = CreateSolidBrush(RGB(currentRed, currentGreen, currentBlue)); FillRect(hdc, ¤tRect, currentColor); DeleteObject(currentColor); } } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { RECT myRect; COLORREF startCol = RGB(71,71,71), endCol = RGB(200,200,200); switch (message) /* handle the messages */ { case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; case WM_ERASEBKGND: GetClientRect(hwnd, &myRect); GradientFillRect(HDC (wParam), &myRect, startCol, endCol, false); return 1; // indicate that WM_ERASEBKGND was handled default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } |
问题(WIN3204) | 如何在C/C++中更改当前工作目录?[顶部] |
答案 | _chdir [^]。SetCurrentDirectory [^]。 |
问题(WIN3205) | 如何获取我的硬盘名称及其所有相关信息?[顶部] |
答案 | 您可以使用WMI。 这是使用WMI的示例链接 WMI C++ 示例[^] 这是您可能正在寻找的包含所有硬盘信息的WMI类 Win32_PhysicalMedia[^] |
问题(WIN3206) | 如何获取我的域中所有用户的登录名?[顶部] |
答案 | 您可以尝试 NetUserEnum() 或 NetQueryDisplayInformation() |
问题(WIN3207) | 如何获取临时文件夹路径?[顶部] |
答案 | 您可以尝试 GetTempPath() 或 SHGetSpecialFolder() |
问题(WIN3208) | 将CString转换为标准C++字符串最简单的方法是什么?[顶部] |
答案 | 字符数组?CString CStr = ...; LPTSTR pTCharStr = new TCHAR[CStr.GetLength() + 1]; _tcscpy_s(pTCharStr, CStr.GetLength() + 1, CStr);还是STL字符串? #include <string>... CString CStr = ...; #if defined(_UNICODE) wstring stdstr = CStr; #else string stdstr = CStr; #endif |
问题(WIN3209) | 如何获取Win CE设备的名称?[顶部] |
完整问题 | 我正在开发Windows Mobile。有没有API可以确定设备的名称? |
答案 | 您可以尝试 GetSystemInfo() 或 SystemParameters() |
问题(WIN3210) | 如何捕获Windows关机(或休眠)事件以及禁用它的方法?[顶部] |
答案 | 在系统关机的情况下,您必须等待WM_POWERBROADCAST 事件,并从其中返回BROADCAST_QUERY_DENY 将阻止您的系统关机。 |
问题(WIN3211) | 如何使用C++检查注册表项是否存在?[顶部] |
答案 | 如果您想检查注册表项是否存在HKEY hKey = NULL; string MyChoiceVariable; if (ERROR_SUCCESS != RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\..", 0, KEY_QUERY_VALUE, &hKey )) { MyChoiceVariable = "KEY DOES NOT EXIST"; cout << MyChoiceVariable << endl; } if (ERROR_SUCCESS == RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\..", 0, KEY_QUERY_VALUE, &hKey )) { MyChoiceVariable = "KEY EXISTS"; cout << MyChoiceVariable << endl; } |
问题(WIN3212) | 如何创建共享文件和文件夹?[顶部] |
完整问题 | 我正在编写一个安装程序,其中创建了许多文件夹。有没有办法确保创建的文件夹可以通过网络进行读写共享。假定执行安装的人具有管理员权限。 |
答案 | 尝试 NetShareAdd() http://msdn2.microsoft.com/en-us/library/bb525384%28VS.85%29.aspx[^] |
问题(WIN3213) | 坐标是客户区坐标,但如果窗口正在滚动则不正确。我该怎么办?[顶部] |
答案 | 答案 1
使用 GetScrollInfo,将滚动量(lpsi->nPos)添加到检索到的客户坐标中。希望这有帮助! 答案 2滚动窗口与它所附加的窗口没有实际关系。以记事本为例。每次您单击滚动条上的向上箭头时,文本会移动一行。所以像素量会根据字体大小而变化。这对某些外部程序来说是不可用的。当程序使用滚动条并被要求绘制窗口时,它会获取滚动位置,并根据自己的喜好解释它。它们如何做到这一点将取决于应用程序... |
问题(WIN3214) | 如何使用Rundll32.exe运行dll?[顶部] |
答案 |
要利用rundll32.exe,您导出的函数必须遵循一些规则,例如原型必须如下所示:-
void CALLBACK MsgBoxW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow) { MessageBox(hwnd, lpszCmdLine, L"MyMessageBox", MB_OK); }使用def文件 LIBRARY "MyDLL"EXPORTSMsgBoxW @1 欲了解完整讨论,请参阅 http://support.microsoft.com/?scid=kb%3Ben-us%3B164787&x=14&y=14[^] |
问题(WIN3215) | 如何检测用户的用户界面语言?[顶部] |
答案 |
|
问题(WIN3216) | 如何检查进程内存使用情况?[顶部] |
完整答案 | 我正在编写一个需要持续运行的多线程程序。由于该程序使用了大量内存分配(除了我自己的分配之外,MFC在使用CStrings等时也会进行一些分配),我希望能够随时监视程序的内存使用情况。有没有人知道可以通过C++语句请求程序使用的总内存量的方法,以便我可以在程序运行时在跟踪文件中报告此使用情况。 |
答案 |
尝试 |
通用 |
|
问题(GEN01) | 如何从C++调用外部.js文件中的函数?[顶部] |
答案 | 以下链接会有所帮助:- |
问题(GEN02) | 如何获取一年的总天数(无论是365天还是366天)?[顶部] |
答案 | 答案#1 如果年份是4的倍数,那就是闰年,即有366天。 例外#1 如果年份能被100整除,那它就不是闰年。 例外#2 如果年份能被400整除,那它仍然是闰年。 提示:使用取模运算符。 答案#2 bool isLeapYear(int year )
{
return year % 400 ? year % 100 ? year % 4 ? false : true : false : true;
}
|
问题(GEN03) | 如何开发Windows系统启动应用程序?[顶部] |
答案 | 您可以阅读Mark Russinovich(来自sysinternals)的文章,网址为http://technet.microsoft.com/en-us/sysinternals/bb897447.aspx[^] 例如,您可以下载该程序的源代码。您可以在web.archive.com找到源代码http://web.archive.org/web/20060110210637/www.sysinternals.com/Information/NativeApplications.html[^] |
问题(GEN04) | 如何在VS2005中部署可执行文件?[顶部] |
完整问题 | 我已经在发布模式下构建了可执行文件,当我尝试将其部署到目标PC时, 我遇到以下错误 "此应用程序未能启动,因为应用程序配置不正确。重新安装此应用程序可能会解决问题。" |
答案 | 请点击此链接:- http://msdn.microsoft.com/en-us/library/zebw5zk9(VS.80).aspx[^] |
问题(GEN05) | 如何获得XP风格外观?[顶部] |
完整问题 | 我从旧的VC++6迁移到VC++2005,我希望我的应用程序具有XP外观 |
答案 | 有很多方法可以在VS2005或2008上实现。这是我的方法
"XPCommonControls.manifest" 在与您的 .exe 相同的文件夹中<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestversion="1.0">
<dependency>
<dependentassembly>
<assemblyidentity>
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"/>
|
问题(GEN06) | 如何将十六进制格式转换为人类可读的值?[顶部] |
完整问题 | 我有一个文件,其中包含十六进制值。我想将其转换为人类可读的形式。 |
答案 | 假设是ANSI构建,错误处理留给读者FILE * fpin = fopen("MyBinaryFile.foo","rb"); FILE * fpout = fopen("MytextFile.txt","w"); int c; int count = 0; while ( (c=getc(fpin)) != EOF ) { fprintf(fpout, "%02x ", c); if (count % 16 == 15) fprintf(fpout, "\n"); count++; } fclose(fpin); fclose(fpout); |
问题(GEN07) | 程序如何检测本地计算机是否连接到网络?[顶部] |
答案 | 请点击此链接:- http://www.pcausa.com/resources/InetActive.txt[^] |
问题(GEN08) | 我想构建通过USB端口通信的应用程序。如何开始?[顶部] |
答案 | USB常见问题解答[ http://www.lvr.com/usbfaq.htm[^] ] |
问题(GEN09) | 如何设置应用程序或dll的有效期?[顶部] |
完整问题 | 我想创建一个免费试用版软件,在30天后停止运行,或者其他时间,我该怎么做? |
答案 | 简单的方法是
|
问题(GEN10) | 访问NULL指针而不崩溃?[顶部] |
完整问题 |
请告诉我这个程序是如何工作的...我将一个指向类的指针设置为零,但只要我不访问任何实例变量,我仍然可以访问实例成员。 #include "stdafx.h" #include <stdio.h> class A { public: int i; void PrintMe(); }; void A::PrintMe() { printf("Hello World\n"); } void main() { A* p = 0; p->PrintMe(); } |
答案 | 答案#1
A::PrintMe函数不访问类成员,也不是虚函数,因此不使用this指针。这是完全合法的。 答案#2在p上调用方法实际上并没有解引用p,它只是将this设置为p的值。如果PrintMe()解引用了this,例如访问非静态数据成员,那么代码就会崩溃。 |
问题(GEN11) | 如何声明和初始化从一个dll导出并在各种文件中使用的全局变量?[顶部] |
答案 | 在DLL中
|
问题(GEN12) | 如何将包含嵌入式NULL字符的char数组转换为BSTR?[顶部] |
完整问题 |
我想将包含嵌入式NULL(/0)字符的char数组转换为BSTR。例如 |
答案 | 最好的方法是char cArr[] = { '1', '2', '\0', '3', '\0', '4', '5', '\0' }; BSTR MyBstr = ::SysAllocStringByteLen(cArr, sizeof(cArr)); _bstr_t bstrSend(MyBstr, true); |
问题(GEN13) | 如何从非托管代码调用.NET托管DLL?[顶部] |
完整问题 |
我想用.Net开发一个DLL来发送电子邮件(使用命名空间System.Web.Mail),然后我想在MFC应用程序中调用它。所以我想知道是否可以在MFC应用程序中调用.Net DLL? |
答案 | 点击此链接 http://support.microsoft.com/kb/828736[^] |
问题(GEN14) | 如何在编译时获取项目名称?[顶部] |
完整问题 |
在编译时是否有可能获取项目名称?我需要项目名称作为字符串。 |
答案 |
|
问题(GEN15) | 如何检测指针是指向栈还是堆?[顶部] |
完整问题 |
我有一个指针列表 (CList)。其中一些指向堆中的变量,另一些则不指向。我定义了一个析构函数来释放内存空间,但是当我删除指向栈中变量的指针时,程序会崩溃。 |
答案 |
// IsOnStack.cpp:定义控制台应用程序的入口点。// #include "stdafx.h" #include <iostream> #include <windows.h> using namespace std; bool IsOnStack(const void *pData) { DWORD StackBase; DWORD StackLimit; __asm { MOV EAX, DWORD PTR FS:[0x04] MOV StackBase, EAX MOV EAX, DWORD PTR FS:[0x08] MOV StackLimit, EAX } DWORD Address = reinterpret_cast<DWORD>(pData); return (Address >= StackLimit) && (Address < StackBase); } const char* PrintStack(const void *pData) { return IsOnStack(pData) ? ": Stack" : ": Not on Stack"; } int main(int argc, char* argv[]) { const char *pString1 = "String1"; cout << pString1<< PrintStack(pString1) << endl; char String2[] = "String2"; cout << String2 << PrintStack(String2) << endl; return 0; } 输出是
|
问题(GEN16) | 是否可以在C++中创建NFS挂载?[顶部] |
答案 |
“NFS 挂载”一词暗示了一个设备驱动程序。通常不建议在 C++ 中开发 Microsoft Windows 设备驱动程序,尽管可以做到。Microsoft 提供了 IFS Kit[ http://www.microsoft.com/whdc/DevTools/IFSKit/default.mspx[^]] 用于开发文件系统和文件系统过滤器。 |
问题(GEN17) | #pragma once 的意义是什么?[顶部] |
答案 |
|
问题(GEN18) | CWebBrowser2如何使用代理?[顶部] |
答案 |
应用程序可以为 (HINTERNET) using InternetSetOption. [ BOOL InternetSetOption( __in HINTERNET hInternet, __in DWORD dwOption, __in LPVOID lpBuffer, __in DWORD dwBufferLength ); ^]其中 hInternet,InternetOpen 实例,如果为 NULL ,则设置的范围是全局的并且是 Internet Explorer 的默认选项设置。因此它会更改 WebBrowser 控件的设置 以及 IE 的所有实例。如果您想仅为您的应用程序指定代理设置而不 更改默认设置,我不知道 WebBrowser 控件公开的任何接口。但经过一些 努力,您可以实现这一点,您可以为您的应用程序打开一个带有代理设置的 HINTERNET、InternetOpen 实例, 并使用 [wininet APIs[ http://msdn.microsoft.com/en-us/library/aa385473(VS.85).aspx[^]] 下载 URL 文件 并在 WebBrowser 控件中显示 HTML 源。也就是说,WebBrowser 控件仅用于渲染 HTML 和获取 UI 事件,连接由您的程序处理。
|
问题(GEN19) | Vista权限提升问题?[顶部] |
完整问题 |
当我运行我的程序时,它会显示错误 “请求的操作需要提升权限”。我的程序编译正确,但此时会显示错误 |
答案 | 请查看以下链接 |
问题(GEN20) | 如何从蓝牙读取数据?[顶部] |
完整问题 |
我买了一个简单的蓝牙外部设备(比如华硕WL-BTD201蓝牙适配器)。我想创建一个简单的程序来读取它,但我不知道该怎么做。有没有免费的库可以使用?我听说蓝牙有堆栈(???)。比如WIDCOMM堆栈。老实说,我不知道该怎么做。有人能帮忙吗? |
答案 | Broadcom公司的蓝牙开发工具包[^]免费分发。 |
有趣 |
|
问题(FUN01) | 如何扫描或识别空白可写CD上的物理损坏(如划痕或斑点)?[顶部] |
答案 | 您将需要一小块棉球、温和的液体肥皂、清水和一盏台灯。 在水中滴几滴液体肥皂,将棉球浸泡在肥皂水中,轻轻擦拭光盘表面,来回摩擦棉球,呈摇摆状。 打开台灯,让光线照亮CD表面。现在您可以轻松发现上面的划痕和物理损伤。 顺便说一句,这个论坛是针对Visual C++问题的。 |
问题(FUN02) | 如何在应用程序关闭后显示消息框?[顶部] |
如何在应用程序关闭后显示消息框?
|
|
问题(FUN03) | 关于多态性的轻松一面![顶部] |
答案 |
关于多态性的轻松一面:- |
专家
<><>以上问题由以下专家解答:- |
|
关注点
没什么好说的,创意和设计都取自Michael Dunn先生(MS Visual C++ MVP)的CPP论坛常见问题解答文章。
请继续关注本系列更多文章。
特别感谢
- 我的父母和我的妻子
- 所有活跃的贡献者/Visual C++ 论坛 [CodeProject] 的成员,没有他们,这篇文章就不会问世。
本系列的其他文章
历史
- 2010年7月25日:发布在CodeProject上。(是的,这篇文章花了5年才发表)
- 2006年7月11日:开始撰写这篇文章。