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日:开始撰写这篇文章。



