zoukankan      html  css  js  c++  java
  • Visual C++ 2011524

    一.公共对话框

    文档很详细

    http://msdn.microsoft.com/en-us/library/ms646954(VS.85).aspx

    二.获取操作系统版本

    OSVERSIONINFO osvi;
    ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    
    GetVersionEx(&osvi);
    

    三.AfxIsValid函数'

    1.AfxIsValidAddress

    Tests any memory address to ensure that it is contained entirely within the program's memory space.

    // Allocate a 5 character array, which should have a valid memory address.
    char* arr = new char[5];
    
    // Create a null pointer, which should be an invalid memory address.
    char* null = (char*)0x0;
    
    ASSERT(AfxIsValidAddress(arr, 5));
    ASSERT(AfxIsValidAddress(null, 5));
    

    2.AfxIsValidString

    Use this function to determine whether a pointer to a string is valid.

    // Create a character string which should be valid.
    char str[12] = "hello world";
    
    // Create a null pointer, which should be an invalid string.
    char* null = (char*)0x0;
    
    ASSERT(AfxIsValidString(str, 12));
    ASSERT(!AfxIsValidString(null, 5));   
    

    四.钩子的类型

    http://www.cppblog.com/sleepwom/archive/2010/02/03/107094.html

    五.c的函数多参数类型

    即用在函数中用…标识多个未知参数,然后用va_list,va_start,va_arg,va_end指令来读取数据.读取时的数据顺序和类型不可以错乱

    void testit ( int i, ...)
    {
       va_list argptr;
       va_start(argptr, i);
    
       int n = va_arg( argptr, int );
       char *s = va_arg( argptr, char* );
       va_end(argptr);
    }
    
    int main()
    {
       testit( 0, 10,"aaa" ); 
    }
    

    参考:http://blog.csdn.net/mader/archive/2007/08/20/1751893.aspx

    六.Shell Path函数

    1.PathRemoveFileSpec

    Removes the trailing file name and backslash from a path, if they are present.

    #include <windows.h>
    #include <iostream.h>
    #include "Shlwapi.h"

    void main( void )
    {
    // Path to include file spec.
    char buffer_1[ ] = "C:\\TEST\\sample.txt";
    char *lpStr1;
    lpStr1 = buffer_1;

    // Print the path with the file spec.
    cout << "The path with file spec is          : " << lpStr1 << endl;

    // Call to "PathRemoveFileSpec".
    PathRemoveFileSpec(lpStr1);

    // Print the path without the file spec.
    cout << "\nThe path without file spec is       : " << lpStr1 << endl;
    }

    OUTPUT:
    ==================
    The path with file spec is          : C:\TEST\sample.txt

    The path without file spec is       : C:\TEST

    其他函数:http://msdn.microsoft.com/zh-cn/library/bb773559(en-us,VS.85).aspx

    七.注册表读取项

    1.用RegQueryInfoKey函数读取一个项的相关信息,大部分为输出变量,可以根据需要获取,不需要的设置为NULL

        // Get the class name and the value count. 
        retCode = RegQueryInfoKey(
            hKey,                    // key handle 
            achClass,                // buffer for class name 
            &cchClassName,           // size of class string 
            NULL,                    // reserved 
            &cSubKeys,               // number of subkeys 
            &cbMaxSubKey,            // longest subkey size 
            &cchMaxClass,            // longest class string 
            &cValues,                // number of values for this key 
            &cchMaxValue,            // longest value name 
            &cbMaxValueData,         // longest value data 
            &cbSecurityDescriptor,   // security descriptor 
            &ftLastWriteTime);       // last write time 
    

    2.遍历项键值

    2.1遍历key

    for (i=0; i<cSubKeys; i++) 
    { 
        cbName = MAX_KEY_LENGTH;
        retCode = RegEnumKeyEx(hKey, i,
                 achKey, 
                 &cbName, 
                 NULL, 
                 NULL, 
                 NULL, 
                 &ftLastWriteTime); 
        if (retCode == ERROR_SUCCESS) 
        {
            _tprintf(TEXT("(%d) %s\n"), i+1, achKey);
        }
    }
    

    2.2遍历值

    for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++) 
    { 
        cchValue = MAX_VALUE_NAME; 
        achValue[0] = '\0'; 
        retCode = RegEnumValue(hKey, i, 
            achValue, 
            &cchValue, 
            NULL, 
            NULL,
            NULL,
            NULL);
     
        if (retCode == ERROR_SUCCESS ) 
        { 
            _tprintf(TEXT("(%d) %s\n"), i+1, achValue); 
        } 
    }
    

    八.预处理命令的使用技巧

    1.下面的Release只有动态的时候才知道,这犹如动态语言,但与动态语言不同的是,在编译过程中检测出了错误,这实际上是一个展开的过程的.

    #define SAFE_RELEASE(p)  { if(p) { p.Release(); (p)=NULL; } }
    

    2.动态更改变量,AddNum给改变了i变量,那么i就是一个变量约定

    #define AddNum() { i++;}
    
    int main( void )
    {
    int i=0;
    AddNum();
    }
    

    3.用宏调用函数,记得是函数,不是bool变量,这实质跟c#的委托是一个概念的用法

    #define SAFE_FUN(p)  { p(); }
    
    bool test()
    {
        return 1;
    }
    int main( void )
    {
        SAFE_FUN(test);
    
    }
    

    4.用宏跳转

    一般都不推荐使用挑战,但个人感觉这种跳转方式很好

    #define GOTO_IF_(type, expr, func, e_val, s_val, var, label)    \
            do                                                        \
            {                                                        \
                type temp = (expr);                                    \
                if( func(temp) )                                    \
                {                                                    \
                    var = e_val;                                    \
                    goto label;                                        \
                }                                                    \
                else var = s_val;                                    \
            } while ( false )
    #define GOTO_IF_FALSE(expr)            GOTO_IF_(bool, expr, !, E_FAIL, S_OK, hr, Exit)
    
    bool test()
    {
        return 1;
    }
    int main( void )
    {
        HRESULT hr;
        GOTO_IF_FALSE(test());
        Exit:
        return hr;
    }
    

    九.资源的加载

    MAKEINTRESOURCE是加载本地程序的资源,可以理解为当调用LoadString时,第一个参数是NULL的,所以MAKEINTRESOURCE不能用于多国语言

    //加载DLL
    HINSTANCE hModule = LoadLibrary(_T("test.dll"));
    if (hModule == NULL)
    {
        AfxMessageBox(_T("test.dll加载失败\n"));
        return;
    }
    
    //加载字符串资源
     CString strText = _T("");
     if (::LoadString(hModule, 1000, strText.GetBuffer(256), 256) != 0)
    {
        //设置标题
        SetWindowText(strText);
    }
    ...

    参考:http://www.cnblogs.com/liuweijian/archive/2011/01/20/1940665.html
    http://blog.csdn.net/John_Yang/archive/2010/05/02/5549400.aspx

    十.使用DLL中的MFC对话框

    在DLL中必须调用以下代码

    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
  • 相关阅读:
    面向对象的分析与设计
    Django的ORM补充
    JDBC数据库连接池
    Python 中的深浅拷贝
    智能机系统分析
    hyperf框架学习
    HTTP协议知识
    百度知道有关php抓取问题
    awk之FS的指定
    从DELPHI到JAVA[delphi]
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/2055931.html
Copyright © 2011-2022 走看看