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

45 天系列:CodeProject VC++ 论坛问答 - V

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (14投票s)

2010年7月25日

CPOL

21分钟阅读

viewsIcon

53579

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

    因为它应用程序类的基类。一个应用程序不需要多个应用程序类。实现依赖于从AfxGetApp()获得的全局对象,该对象由winMain中的AfxWinMain使用。那么这类似于问为什么一个应用程序只有一个main函数。

    “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 Shucks
    #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, &currentRect, 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,您导出的函数必须遵循一些规则,例如原型必须如下所示:-

    CALLBACK MsgBoxW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow); 那么一个可用的示例(至少在XP上有效...)将是

    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) 如何检测用户的用户界面语言?[顶部]
    答案

    GetSystemDefaultLangID() 返回系统区域设置。它用于确定非Unicode(也称为“ANSI”)文本使用的代码页。它可以在(XP上)通过控制面板中“区域和语言选项”的“高级”选项卡进行更改(可能需要重新启动才能生效)。GetUserDefaultUILanguage() 返回当前UI语言,如果安装了MUI包,用户可以设置该语言。

     
    问题(WIN3216) 如何检查进程内存使用情况?[顶部]
    完整答案 我正在编写一个需要持续运行的多线程程序。由于该程序使用了大量内存分配(除了我自己的分配之外,MFC在使用CStrings等时也会进行一些分配),我希望能够随时监视程序的内存使用情况。有没有人知道可以通过C++语句请求程序使用的总内存量的方法,以便我可以在程序运行时在跟踪文件中报告此使用情况。
    答案

    尝试 GetProcessMemoryInfo()

       
       

    通用

     
       
    问题(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上实现。这是我的方法
    1. 在程序的最开头添加 InitCommonControls() 调用。
    2. 在stdafx.h文件中,添加此行:#include "commctrl.h" 在您的项目属性中
    3. 在“链接器/清单文件”中,确保“生成清单”条目设置为“是”
    4. 在“链接器/命令行”中添加 "comctl32.lib" (不带引号)
    5. 在“清单工具/输入和输出”中,将 “附加清单文件” 设置为 $(IntDir)\XPCommonControls.manifest
    最后,创建一个包含此代码的新文本文件,并将其保存为 "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天后停止运行,或者其他时间,我该怎么做?
    答案 简单的方法是
    1. 选择一个地方存储日期(注册表、文件等)
    2. 当应用程序启动时,检查该位置的日期
    3. 如果没有找到日期,则将当前日期存储在那里
    4. 如果找到日期,则从存储的日期中减去当前日期。
    5. 将差值与您的时间限制进行比较。像这样的方案存在巨大的明显漏洞(找到日期并删除它以重置试用期)。但是,它们确实有效。
     
    问题(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中

    __declspec(dllexport) int g_iYourVariable;

    在EXE文件中

    __declspec(dllimport) int g_iYourVariable;

     
    问题(GEN12) 如何将包含嵌入式NULL字符的char数组转换为BSTR?[顶部]
    完整问题

    我想将包含嵌入式NULL(/0)字符的char数组转换为BSTR。例如cArr['1','2','NULL','3','NULL','4','5','NULL']。是否有可能在不丢失任何内容的情况下将其转换为bstr。因此_bstr_t变量将包含“12NULL3NULL45NULL”

    答案 最好的方法是
         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) 如何在编译时获取项目名称?[顶部]
    完整问题

    在编译时是否有可能获取项目名称?我需要项目名称作为字符串。

    答案
    1. 如果您使用的是VS2005,请从项目属性中获取项目名称的值,vsproperty->c/c++->预处理器->预处理器定义:PROJECT_NAME=$(ProjectName)
    2. 现在在您的代码中使用上面的PROJECT_NAME宏,
           #define STRINGIZE(_x) #_x
           #define STRINGIZEVALUE(_x) STRINGIZE(_x)
           
           char projectName[]= STRINGIZEVALUE(PROJECT_NAME);
          
     
    问题(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;
             }
            

    输出
    字符串1:不在栈上
    字符串2:栈上

     
    问题(GEN16) 是否可以在C++中创建NFS挂载?[顶部]
    答案

    “NFS 挂载”一词暗示了一个设备驱动程序。通常不建议在 C++ 中开发 Microsoft Windows 设备驱动程序,尽管可以做到。Microsoft 提供了 IFS Kit[ http://www.microsoft.com/whdc/DevTools/IFSKit/default.mspx[^]] 用于开发文件系统和文件系统过滤器。

    但是,如果您只是想使用已有的东西(或者有一些常识),那么也许您可以使用 Microsoft Windows Services for UNIX[ http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx[^]]。这个链接将为您提供一个开端。
    http://www.openfree.org/pet/index.php/Mount_an_NFS_share_from_Windows[^]

     
    问题(GEN17) #pragma once 的意义是什么?[顶部]
    答案

    #pragma once 指令指定文件在编译源代码文件时只被编译器包含一次。这可以减少构建时间,因为编译器在第一次包含模块后不会打开和读取该文件。

     
    问题(GEN18) CWebBrowser2如何使用代理?[顶部]
    答案

    应用程序可以为 InternetOpen 实例使用不同的代理设置

        (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) 如何在应用程序关闭后显示消息框?[顶部]
    如何在应用程序关闭后显示消息框?
    1. 当您的应用程序仍在运行时显示消息框。
    2. 按下键盘上的Print Screen键。
    3. 关闭您的应用程序。
    4. 打开MS Paint。
    5. 粘贴图像 ( CTRL + V )。
    6. 享受您的消息框
     
    问题(FUN03) 关于多态性的轻松一面![顶部]
    答案

    关于多态性的轻松一面:-

    教师对象在两个学生实例上调用LearnPolymorphism()方法。第一个实例,
    比如cleverPupil,它实际上是CleverPupil的一个实例,调用readBook(goodOOPBook)来完成任务。
    另一方面,第二个学生实例,比如lazyPupil,它是LazyPupil的一个实例,用自己的方式实现该方法,
    通过调用startAsking(hereAndThere)...

    CleverPupilLazyPupil都继承自Pupil,因此教师能够在它们上面调用虚拟的Pupil方法
    LearnPolymorphism()。但是,由于多态性,教师从它们那里获得了两个截然不同的结果。

       

    专家

    <><>   
    以上问题由以下专家解答:-
    • Rajesh R Subramanian
    • Roger Stoltz
    • cmk
    • CPallini
    • Michael Schubert
    • PJ Arends
    • ThatsAlok
    • DavidCrow
    • Naveen
    • Michael Dunn
    • cofi++
    • Moak
    • 迈克·奥尼尔
    • SandipG
    • Mark Salsbery
    • Alain Rist
    • J_E_D_I
    • Maxwell Chen
    • Iain Clarke
    • Nibu babu thomas
    • Rajkumar R
    • Stephen Hewitt
    • led mike

     

       

    关注点

    没什么好说的,创意和设计都取自Michael Dunn先生(MS Visual C++ MVP)的CPP论坛常见问题解答文章。

    请继续关注本系列更多文章。

    特别感谢

    • 我的父母和我的妻子
    • 所有活跃的贡献者/Visual C++ 论坛 [CodeProject] 的成员,没有他们,这篇文章就不会问世。

    本系列的其他文章

    历史

    • 2010年7月25日:发布在CodeProject上。(是的,这篇文章花了5年才发表)
    • 2006年7月11日:开始撰写这篇文章。
    © . All rights reserved.