标签: vc

  • VC结束进程

    VC结束第三方应用的进程:

    BOOL GetDebugPriv()
    {
        HANDLE hToken;
        LUID sedebugnameValue;
        TOKEN_PRIVILEGES tkp;
    
        if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY , &hToken))
        {
            return FALSE ;
        }
    
        if (! LookupPrivilegeValue( NULL , SE_DEBUG_NAME , &sedebugnameValue))
        {
            CloseHandle(hToken);
            return FALSE ;
        }
    
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Luid = sedebugnameValue;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED ;
    
        if (!AdjustTokenPrivileges(hToken, FALSE , &tkp, sizeof tkp, NULL, NULL))
        {
            CloseHandle(hToken);
            return FALSE ;
        }
    
        return TRUE ;
    }
    
    
    void CToolDlg ::KillProcess()
    {
                    GetDebugPriv();
    
                     PROCESSENTRY32 pe32;
                    pe32.dwSize = sizeof (pe32);
                     HANDLE hProcessSnap = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);
                     if (hProcessSnap == INVALID_HANDLE_VALUE )
                    {
                                     MessageBox (L"CreateToolhelp32Snapshot调用失败!\n" );
                                     return ;
                    }
    
                     CString strPrcNameID;
                     BOOL bMore = ::Process32First (hProcessSnap, &pe32);
                     while (bMore)
                    {
                                     if (lstrcmp (pe32.szExeFile, _TEXT( "contrlvip.exe")) == 0)
                                    {
                                                     HANDLE hTargetProcess = OpenProcess(PROCESS_QUERY_INFORMATION |   // Required by Alpha
                                                                     PROCESS_CREATE_THREAD |   // For CreateRemoteThread
                                                                     PROCESS_VM_OPERATION |   // For VirtualAllocEx/VirtualFreeEx
                                                                     PROCESS_VM_WRITE |  // For WriteProcessMemory
                                                                     PROCESS_TERMINATE ,           //Required to terminate a process using TerminateProcess function
                                                                     FALSE , pe32.th32ProcessID);
    
                                                     if (hTargetProcess == NULL )
                                                    {
                                                                     DWORD ulErrCode = GetLastError();
                                                                     CString strError;
                                                                    strError.Format( L"OpenProcess failed,error code:%ld" , ulErrCode);
                                                                    AfxMessageBox(strError);
                                                    }
    
                                                     BOOL result = TerminateProcess(hTargetProcess, 0);
                                                     if (!result)
                                                    {
                                                                     DWORD ulErrCode = GetLastError();
                                                                     CString strError;
                                                                    strError.Format( L"TerminateProcess failed,error code:%ld" , ulErrCode);
                                                                    AfxMessageBox(strError);
                                                    }
                                    }
    
                                    bMore = :: Process32Next (hProcessSnap, &pe32);
                    }
                    ::CloseHandle(hProcessSnap);
    }
    
  • VC获取程序所在的目录

    VC获取程序所在的目录

    CString  GetCurDir()
    {
                     char   sDrive[_MAX_DRIVE ];
                     char   sDir[_MAX_DIR ];
                     char   sFilename[_MAX_FNAME ], Filename[_MAX_FNAME];
                     char   sExt[_MAX_EXT ];
                     GetModuleFileName(AfxGetInstanceHandle(), Filename, _MAX_PATH);
                     _tsplitpath(Filename, sDrive, sDir, sFilename, sExt);
                     CString   homeDir(CString (sDrive) + CString(sDir));
                     int   nLen = homeDir.GetLength();
    
                     if (homeDir.GetAt(nLen - 1)!= '\\' )
                    {
                                    homeDir += '\\' ;
                    }
    
                     return homeDir;
    }
  • VC++获取控制台命令的输出结果

    VC++获取控制台命令的输出结果

    #include "stdafx.h"
    
    #include <Windows.h>
    #include <iostream>
    #include <string>
    using namespace std;
    
    BOOL ExecDosCmd(string cmd, string &output)
    {
        SECURITY_ATTRIBUTES sa;
        HANDLE hRead, hWrite;
    
        sa.nLength = sizeof(SECURITY_ATTRIBUTES);
        sa.lpSecurityDescriptor = NULL;
        sa.bInheritHandle = TRUE;
        if (!CreatePipe(&hRead, &hWrite, &sa, 0))
        {
            return FALSE;
        }
        char command[1024]; // 长达1K的命令行,够用了吧
        strcpy(command, "Cmd.exe /C ");
        strcat(command, cmd.c_str());
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        si.cb = sizeof(STARTUPINFO);
        GetStartupInfo(&si);
        si.hStdError = hWrite;  // 把创建进程的标准错误输出重定向到管道输入
        si.hStdOutput = hWrite; // 把创建进程的标准输出重定向到管道输入
        si.wShowWindow = SW_HIDE;
        si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
        // 关键步骤,CreateProcess函数参数意义请查阅MSDN
        if (!CreateProcess(NULL, command, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
        {
            CloseHandle(hWrite);
            CloseHandle(hRead);
            return FALSE;
        }
        CloseHandle(hWrite);
    
        char buffer[4096] = {0}; // 用4K的空间来存储输出的内容,只要不是显示文件内容,一般情况下是够用了。
        DWORD bytesRead;
        while (true)
        {
            if (ReadFile(hRead, buffer, 4095, &bytesRead, NULL) == NULL)
                break;
            // buffer中就是执行的结果,可以保存到文本,也可以直接输出
            // AfxMessageBox(buffer);   //这里是弹出对话框显示
            // cout << "----:" << endl << buffer << endl;
        }
        CloseHandle(hRead);
    
        output = buffer;
        return TRUE;
    }
    
    int main()
    {
        string output;
        ExecDosCmd("wmic diskdrive get Caption,SerialNumber", output);
        cout << output << endl;
        return 0;
    }
  • VC 递归调用GetWindow查找控件

    VC 递归调用GetWindow查找控件

    HWND g_TargetMainWnd = NULL ;
    BOOL WINAPI   EnumWindowsProc(HWND hWnd, LPARAM lParam)
    {
            if (:: GetWindowLong(hWnd , GWL_STYLE ) & WS_VISIBLE )
           {
                   char szWindowText[128] = { 0 };
                   if (:: GetWindowText(hWnd , szWindowText, 128) != 0)
                  {
                          if (strstr(szWindowText, "职业技能实训平台" ) != NULL )
                         {
                               g_TargetMainWnd = hWnd;
                                return FALSE;
                         }
                  }
    
           }
            return TRUE;
    }
    
    void CAnswerGetDlg ::Work(HWND hSubWnd )
    {
            if ( hSubWnd != NULL)
           {             
                   while ( hSubWnd != NULL)
                  {
                          char szWindowText[128] = { 0 };
                         :: GetWindowText(hSubWnd , szWindowText, 128);
                          if (strstr(szWindowText, "[A]"))
                         {
                                RECT rc;
                                BOOL bret = ::GetWindowRect( hSubWnd, &rc);                                 
                                SetDlgItemText(IDC_EDIT1 , szWindowText + 3);
                                char szCoordinate[16] = { 0 };
                               sprintf(szCoordinate, "%d %d", rc.left, rc.top);
                                SetDlgItemText(IDC_EDIT5 , szCoordinate);
                         }
                          if (strstr(szWindowText, "[B]"))
                         {
                                RECT rc;
                               ::GetWindowRect( hSubWnd, &rc);
                                SetDlgItemText(IDC_EDIT2 , szWindowText + 3);
                                char szCoordinate[16] = { 0 };
                               sprintf(szCoordinate, "%d %d", rc.left, rc.top);
                                SetDlgItemText(IDC_EDIT6 , szCoordinate);
                         }
                          if (strstr(szWindowText, "[C]"))
                         {
                                RECT rc;
                               ::GetWindowRect( hSubWnd, &rc);
                                SetDlgItemText(IDC_EDIT3 , szWindowText + 3);
                                char szCoordinate[16] = { 0 };
                               sprintf(szCoordinate, "%d %d", rc.left, rc.top);
                                SetDlgItemText(IDC_EDIT7 , szCoordinate);
                         }
                          if (strstr(szWindowText, "[D]"))
                         {
                                RECT rc;
                               ::GetWindowRect( hSubWnd, &rc);
                                SetDlgItemText(IDC_EDIT4 , szWindowText + 3);
                                char szCoordinate[16] = { 0 };
                               sprintf(szCoordinate, "%d %d", rc.left, rc.top);
                                SetDlgItemText(IDC_EDIT8 , szCoordinate);
                         }
    
                          HWND hSubWnd2 = ::GetWindow( hSubWnd, GW_CHILD);
                          if(hSubWnd2 != NULL)
                         {
                               Work(hSubWnd2);
                         }
    
                          hSubWnd = ::GetWindow( hSubWnd, GW_HWNDNEXT);
                  }
           }
    }
    
    
    void CAnswerGetDlg ::OnBnClickedOk()
    {
            for ( int i = 0; i < 8; i++)
           {
                   SetDlgItemText(1000 + i, "" );
           }
           ::EnumWindows(( WNDENUMPROC)EnumWindowsProc, NULL );
            if (g_TargetMainWnd != NULL)
           {
                   HWND hSubWnd = ::GetWindow(g_TargetMainWnd, GW_CHILD);
                  Work(hSubWnd);
           }
    }
  • VC 检测文件是否存在

    VC 检测文件是否存在

    bool IsExistFile(LPCSTR pszFileName )
    {
            WIN32_FIND_DATA FindFileData;
            HANDLE hFind;
    
           hFind = FindFirstFile(pszFileName , &FindFileData);
    
            if (hFind == INVALID_HANDLE_VALUE)
                   return false;
            else
           {
                  FindClose(hFind);
                   return true;
           }
            return false;
    }
  • VC库函数获取当前EXE所在的路径

    VC库函数获取当前EXE所在的路径

    TCHAR cfgPath[ MAX_PATH];
    GetModuleFileName(NULL , cfgPath, MAX_PATH);
    PathAppend(cfgPath, "..\\config.ini" );

  • VC确保存路径存在在,如果不存在则创建

    void MakeSureDirExist(const char * pPath )
    {
            if ( pPath == NULL)
                   return;
           std:: string strPath( pPath);
           
            if (strPath.at(strPath.length() - 1) != '\\')
                  strPath += '\\';
    
            int len = strPath.length();
            for( int i =0; i < len; ++i)
           {
                   if(strPath[i]== '\\')
                  {
                         :: CreateDirectory((strPath.substr(0, i)).c_str(), NULL );
                  }
           }
    
    }
  • VC为RichTextBox添加右键菜单

    VC为RichTextBox添加右键菜单

    private void InitRichTextBoxContextMenu(RichTextBox textBox)
    {
        //创建剪切子菜单
        var cutMenuItem = new MenuItem( "剪切");
        cutMenuItem.Click += (sender, eventArgs) => textBox.Cut();
    
        //创建复制子菜单
        var copyMenuItem = new MenuItem( "复制");
        copyMenuItem.Click += (sender, eventArgs) => textBox.Copy();
    
        //创建粘贴子菜单
        var pasteMenuItem = new MenuItem( "粘贴");
        pasteMenuItem.Click += (sender, eventArgs) => textBox.Paste();
    
        //创建右键菜单并将子菜单加入到右键菜单中
        var contextMenu = new ContextMenu();
        contextMenu.MenuItems.Add(cutMenuItem);
        contextMenu.MenuItems.Add(copyMenuItem);
        contextMenu.MenuItems.Add(pasteMenuItem);
    
        textBox.ContextMenu = contextMenu; //为richtextbox设置菜单
    }
  • VC 获取跳转后的网址

    VC 获取跳转后的网址

    BOOL GetRedirectUrl(std::string strUrl , string &redirectUrl )
    {
    
           
        //定义变量 
        HINTERNET hInet = NULL; //打开internet连接handle 
        HINTERNET hConnect = NULL; //HTTP连接 
        HINTERNET hRequestHead = NULL; //HTTP Request 
        HINTERNET hRequestGet = NULL; //HTTP Request 
        HANDLE hFileWrite = NULL; //写文件的句柄 
        char* pBuf = NULL; //缓冲区 
        DWORD dwRequestTryTimes = MAX_DOWNLOAD_REQUEST_TIME; //尝试请求的次数 
        DWORD dwDownBytes = 0; //每次下载的大小 
        DWORD dwDownFileTotalBytes = 0; //下载的文件总大小 
        DWORD dwWriteBytes = 0; //写入文件的大小 
        char bufQueryInfo[ LEN_OF_BUFFER_FOR_QUERYINFO] = {0}; //用来查询信息的buffer 
        DWORD dwBufQueryInfoSize = sizeof(bufQueryInfo); 
        DWORD dwStatusCode = 0; 
        DWORD dwContentLen = 0; 
        DWORD dwSizeDW = sizeof( DWORD); 
           
        //分割URL 
        CHAR pszHostName[ INTERNET_MAX_HOST_NAME_LENGTH] = {0}; 
        CHAR pszUserName[ INTERNET_MAX_USER_NAME_LENGTH] = {0}; 
        CHAR pszPassword[ INTERNET_MAX_PASSWORD_LENGTH] = {0}; 
        CHAR pszURLPath[ INTERNET_MAX_URL_LENGTH] = {0}; 
        CHAR szURL[INTERNET_MAX_URL_LENGTH] = {0}; 
        URL_COMPONENTSA urlComponents = {0}; 
        urlComponents.dwStructSize = sizeof( URL_COMPONENTSA); 
        urlComponents.lpszHostName = pszHostName; 
        urlComponents.dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH; 
        urlComponents.lpszUserName = pszUserName; 
        urlComponents.dwUserNameLength = INTERNET_MAX_USER_NAME_LENGTH; 
        urlComponents.lpszPassword = pszPassword; 
        urlComponents.dwPasswordLength = INTERNET_MAX_PASSWORD_LENGTH; 
        urlComponents.lpszUrlPath = pszURLPath; 
        urlComponents.dwUrlPathLength = INTERNET_MAX_URL_LENGTH; 
           
        BOOL bRet = InternetCrackUrlA( strUrl.c_str(), 0, NULL, &urlComponents); 
        bRet = (bRet && urlComponents.nScheme == INTERNET_SERVICE_HTTP); 
        if (!bRet) 
        { 
            goto _END_OF_DOWNLOADURL; 
        } 
           
        //打开一个internet连接 
        hInet = InternetOpenA( DOWNHELPER_AGENTNAME, INTERNET_OPEN_TYPE_PRECONFIG , NULL, NULL , NULL ); 
        if (!hInet) 
        { 
            bRet = FALSE; 
            goto _END_OF_DOWNLOADURL; 
        } 
           
        //打开HTTP连接 
        hConnect = InternetConnectA(hInet, pszHostName, urlComponents.nPort, pszUserName, pszPassword, INTERNET_SERVICE_HTTP , 0, NULL ); 
        if (!hConnect) 
        { 
            bRet = FALSE; 
            goto _END_OF_DOWNLOADURL; 
        } 
           
        //创建HTTP request句柄 
        if (urlComponents.dwUrlPathLength !=  0) 
            strcpy(szURL, urlComponents.lpszUrlPath); 
        else 
            strcpy(szURL, "/"); 
           
        //请求HEAD,通过HEAD获得文件大小及类型进行校验 
        hRequestHead = HttpOpenRequestA(hConnect, "HEAD", szURL, "HTTP/1.1" , "" , NULL , INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_AUTO_REDIRECT , 0); 
    
    
        bRet = FALSE; 
         dwStatusCode = 0; 
         dwSizeDW = sizeof(DWORD); 
     
            //发送请求 
            bRet = HttpSendRequestA(hRequestHead, NULL, 0, NULL, 0); 
            if (!bRet) 
            { 
                         bRet = FALSE;
                          goto _END_OF_DOWNLOADURL;
       
            } 
            else 
            { 
                //判断HTTP返回的状态码 
                dwStatusCode = 0; 
                dwSizeDW = sizeof( DWORD); 
                bRet = HttpQueryInfo(hRequestHead, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_STATUS_CODE, &dwStatusCode, &dwSizeDW, NULL ); 
                if (bRet) 
                { 
                    //检查状态码 
                    if ( HTTP_STATUS_OK == dwStatusCode) //200 OK 
                    { 
                                      bRet = FALSE;
                                       goto _END_OF_DOWNLOADURL;
                       
                    } 
                                else if (302 == dwStatusCode)
                               {
                                       //GetStatusCode(hRequest);
                                       TCHAR szBuffer[ INTERNET_MAX_URL_LENGTH] = {0};
                                       DWORD dwLen = sizeof(szBuffer);
                                      
                                       // 获取HTTP请求信息(HTTP_QUERY_LOCATION获取的绝对URL在Location应答头)
                                       BOOL bRet = HttpQueryInfo(hRequestHead, HTTP_QUERY_LOCATION, szBuffer, &dwLen, NULL );
                                      
                                       redirectUrl = szBuffer;
                                       goto _END_OF_DOWNLOADURL;
                                      bRet = TRUE;
                               }
                    else 
                    { 
                        bRet = FALSE;  
                    } 
                } 
            }
    
                   //清理 
    _END_OF_DOWNLOADURL: 
                   if ( INVALID_HANDLE_VALUE != hFileWrite) 
                         CloseHandle(hFileWrite); 
                   if (pBuf) 
                          delete [] pBuf; 
                   if (hRequestGet) 
                         InternetCloseHandle(hRequestGet); 
                   if (hRequestHead) 
                         InternetCloseHandle(hRequestHead); 
                   if (hConnect) 
                         InternetCloseHandle(hConnect); 
                   if (hInet) 
            InternetCloseHandle(hInet); 
    
                   return bRet;
         
    }
  • VC WIN32程序中通过__argc和__wargv获取命令行参数

    VC WIN32 程序中通过__argc__wargv获取命令行参数

    wstring send_qq, send_content;
    if (__argc < 3)
            return -2;
    
    send_qq = __wargv[1];
    send_content = __wargv[2];

    如果是多字节版本的工程,就用 __argv