• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            面對(duì)現(xiàn)實(shí),超越自己
            逆水行舟,不進(jìn)則退
            posts - 269,comments - 32,trackbacks - 0
            Textreplace插件的使用:

            1 !include "TextReplace.nsh"
            2 
            3 ${textreplace::ReplaceInFile} "c:\1.txt" "c:\1.txt" "%Install%" "替換的內(nèi)容" "/S=1" $4
            4 ${textreplace::FreeReadBuffer} "$4"
            5 ${textreplace::Unload}
            posted @ 2012-05-04 18:12 王海光 閱讀(2029) | 評(píng)論 (0)編輯 收藏
                在域環(huán)境下,有時(shí)受限賬戶對(duì)文件夾需要讀、寫操作權(quán)限,下面為修改文件夾訪問權(quán)限代碼:
             
             1   ReadINIStr $1 "$EXEDIR\Test.ini" "Directory" "DirectoryName"
             2   ReadINIStr $2 "$EXEDIR\Test.ini" "Directory" "DriverDirectoryName"
             3   ReadEnvStr $3 ALLUSERSPROFILE
             4   CreateDirectory "$3\$1"
             5   CreateDirectory "$3\$2"
             6   ;Make the directory read write accessible by everyone
             7   AccessControl::GrantOnFile \
             8     "$3\$1" "everyone" "GenericRead + GenericWrite"
             9 
            10   AccessControl::GrantOnFile \
            11     "$3\$2" "everyone" "GenericRead + GenericWrite"
                在XP64位系統(tǒng)下,如果將提升權(quán)限的操作放到禁止重定向下面,修改文件夾權(quán)限會(huì)失敗。如果對(duì)C:\WINDOWS\System32下面的配置文件進(jìn)行修改,則必須放到禁止重定向下面修改。否則修改的將是C:\WINDOWS\SysWOW64下的配置文件。
            posted @ 2012-05-04 13:16 王海光 閱讀(5846) | 評(píng)論 (2)編輯 收藏
                 摘要: $INSTDIR

            安裝目錄 ($INSTDIR 可以使用 StrCpy、 ReadRegStr、 ReadINIStr 等等來(lái)更改。例如在 .onInit 函數(shù)里可以用來(lái)做高級(jí)的檢測(cè)安裝定位)。

            注意在卸載程序代碼里,$INSTDIR 為卸載程序所在的目錄而不是在安裝程序里所指定的目錄。例如, 如果你把卸載程序放在 $WINDIR 里并且用戶沒有移動(dòng)它,那么在卸載程序里 $INSTDIR 就等于 $WINDIR。如果你要把卸載程序放到另外的位置,那么你應(yīng)該先把安裝程序的 $INSTDIR 值寫入注冊(cè)表或者其它容易保存的地方,然后在卸載程序里讀取該值并賦值給卸載程序里的 $INSTDIR。

              閱讀全文
            posted @ 2012-05-03 17:30 王海光 閱讀(1174) | 評(píng)論 (0)編輯 收藏
                 摘要: 本文轉(zhuǎn)自:http://topic.csdn.net/t/20031208/15/2540422.html關(guān)于CString總結(jié)前言:串操作是編程中最常用也最基本的操作之一      做為VC程序員,無(wú)論是菜鳥或高手都曾用過CString.而且好像實(shí)際編程中很難離得開它(雖然它不是標(biāo)準(zhǔn)C++中的庫(kù)).因?yàn)镸FC中提供的這個(gè)類對(duì)我們操作字串...  閱讀全文
            posted @ 2012-04-28 09:53 王海光 閱讀(490) | 評(píng)論 (0)編輯 收藏
                 摘要: 轉(zhuǎn)自:http://www.shnenglu.com/humanchao/archive/2011/08/03/152332.html   深入分析MFC文檔視圖結(jié)構(gòu)(項(xiàng)目實(shí)踐)        k_eckel:http://www.mscenter.edu.cn/blog/k_eckel 文檔視圖結(jié)構(gòu)(Document/V...  閱讀全文
            posted @ 2012-04-26 14:06 王海光 閱讀(506) | 評(píng)論 (0)編輯 收藏
            MFC socket的使用方法

            服務(wù)器端:
            在.h文件中。
             1 struct ListeningThreadStruct
             2 {
             3     CString sSaveDir;
             4     int     nListenPort;
             5 };
             6 UINT ListeningThreadProc(LPVOID lparam);
             7 struct FileTransferThreadStruct
             8 {
             9     CString sSaveDir;
            10     SOCKET  hSOCKET;
            11 };
            12 
            13 UINT FileTransferThread(LPVOID lparam);

            在.cpp文件中。
             1 UINT CSocketFun::ListeningThreadProc(LPVOID lparam)
             2 {
             3     ListeningThreadStruct *pPara = (ListeningThreadStruct*)lparam;
             4     int nListenPort  = pPara->nListenPort;
             5     CString sSaveDir = pPara->sSaveDir;
             6     delete pPara;
             7     pPara = NULL;
             8 
             9     SocketThreadInit();
            10     try
            11     {
            12         CSocket liseningSocket;
            13         if ( !liseningSocket.Create(nListenPort) )
            14         {
            15             LOG("創(chuàng)建TCP端口失敗, 可能是端口%d被占用", nListenPort);
            16             return 1;
            17         }
            18 
            19         if ( !liseningSocket.Listen(5) )
            20         {
            21             LOG("啟動(dòng)Socket監(jiān)聽失敗");
            22             return 1;
            23         }
            24 
            25         while(true)
            26         {
            27             CSocket clientSocket;
            28             if ( liseningSocket.Accept(clientSocket) )
            29             {
            30                 FileTransferThreadStruct *pFileTrans = new FileTransferThreadStruct;
            31                 pFileTrans->hSOCKET  = clientSocket.Detach();
            32                 pFileTrans->sSaveDir = sSaveDir;
            33 
            34                 AfxBeginThread(FileTransferThread2, (LPVOID)pFileTrans);
            35             }
            36             else
            37             {
            38                 liseningSocket.Close();
            39                 break;
            40             }
            41         }
            42     }
            43     catch()
            44     {
            45         LOG("監(jiān)控Socket線程收到異常, 監(jiān)聽結(jié)束");
            46         return 0;
            47     }
            48     return 0;
            49 }
            50 
            51 
            52 UINT CSocketFun::FileTransferThread2(LPVOID lparam)
            53 {
            54     FileTransferThreadStruct *pPara = (FileTransferThreadStruct*)lparam;
            55     SOCKET  sock     = pPara->hSOCKET;
            56     CString sSaveDir = pPara->sSaveDir;
            57     delete pPara;
            58     pPara = NULL;
            59 
            60     SocketThreadInit();
            61 
            62     CSocket aSocket;
            63     aSocket.Attach(sock);
            64 
            65     char buffer[SERVER_SOCKET_BUFFERSIZE] = {'\0'};
            66     int nLen = aSocket.Receive(buffer, MAX_PATH);
            67 }

            調(diào)用線程.cpp文件中。
            1 ListeningThreadStruct *pPara = new ListeningThreadStruct;
            2 pPara->sSaveDir    = m_sSaveDir;
            3 pPara->nListenPort = m_nListenPort;
            4 
            5 CWinThread *pThread = AfxBeginThread(ListeningThreadProc, (LPVOID)pPara);

            客戶端:

            示例代碼:
             1 #define OutStr(x, )    \
             2 {\
             3     CString sMsg; \
             4     sMsg.Format(x, __VA_ARGS__); \
             5     if (sMsg.GetLength() < (int)nErrBufLen) \
             6     strcpy_s(pErrorBuf, nErrBufLen, sMsg); \
             7 else \
             8     strcpy_s(pErrorBuf, nErrBufLen, "緩沖區(qū)大小不足"); \
             9 }
            10 
            11 
            12 AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
            13 
            14     if (!AfxSocketInit())
            15     {
            16         return 1 ;
            17     }
            18 
            19     SocketThreadInit();
            20 
            21     CSocket aSocket;
            22     if (!aSocket.Create())
            23     {
            24         OutStr("創(chuàng)建socket失敗");
            25         return 1;
            26     }
            27 
            28     if (!aSocket.Connect(sServerIP, nPort))
            29     {
            30         OutStr("連接服務(wù)器失敗IP %s 端口 %d", sServerIP, nPort);
            31         return 1;
            32     }
            33 
            34     CFile file;
            35     if (!file.Open(sFile, CFile::modeRead))
            36     {
            37         OutStr("發(fā)送文件時(shí), 文件%s打開失敗", sFile);
            38         return 1;
            39     }
            40 
            41     // 1. send file name
            42     char fileName[MAX_PATH] = {'\0'};
            43     strcpy_s( fileName, MAX_PATH, CCommonFun::GetFileFullName(sFile) );
            44     if ( SOCKET_ERROR == aSocket.Send(fileName, MAX_PATH) )
            45     {
            46         OutStr("文件名通過socket發(fā)送失敗");
            47         return 1;
            48     }
            49 
            50     // 2. send file size
            51     ULONGLONG ulFileLen = file.GetLength();
            52     if (SOCKET_ERROR == aSocket.Send(&ulFileLen, sizeof(ULONGLONG) ) )
            53     {
            54         OutStr("文件長(zhǎng)度通過socket發(fā)送失敗");
            55         return 1;
            56     }
            57 
            58     try
            59     {
            60         char buffer[CLIENT_SOCKET_BUFFERSIZE] = {'\0'};
            61         UINT nTotalLen = 0;
            62         UINT nLen = 0;
            63         while ((nLen = file.Read(buffer, CLIENT_SOCKET_BUFFERSIZE)) > 0)
            64         {
            65             if (SOCKET_ERROR == aSocket.Send(buffer, nLen))
            66             {
            67                 OutStr("文件數(shù)據(jù)通過socket發(fā)送失敗, 已發(fā)送%d", nTotalLen);
            68                 return 1;
            69             }
            70 
            71             nTotalLen += nLen;
            72         }            
            73     }
            74     catch ()
            75     {
            76         OutStr("發(fā)送文件數(shù)據(jù)時(shí)收到一個(gè)異常, 發(fā)送失敗");
            77         return 1;
            78     }
            79 
            80 #define SOCKET_OK_BUFFERSIZE 1024
            81     char szOK[SOCKET_OK_BUFFERSIZE] = {'\0'};
            82     int nLen = aSocket.Receive(szOK, SOCKET_OK_BUFFERSIZE);
            83     if (CString(szOK) != "ok")
            84     {
            85         OutStr("未收到合法的服務(wù)器回文, 發(fā)送失敗");
            86         return 1;
            87     }

            posted @ 2012-04-26 13:58 王海光 閱讀(1864) | 評(píng)論 (0)編輯 收藏
            MFC一種線程的使用方法

            在.h文件中。
             1 struct MonitorPara 
             2 {
             3     enum SaveType
             4     {
             5         OnlySend,
             6         SendSave,
             7         SendErrorSave
             8     };        
             9     
            10     int        m_nListenPort;        // monitor local ip port
            11     CString m_sServerIP;            // send data server ip
            12     int        m_nServerPort;        // send data server port
            13 
            14     SaveType m_SaveType;
            15     CString     m_sDataBufDir;
            16 };
            17 
            18 static UINT ListeningThreadProc(LPVOID lparam);

            在.cpp文件中。
             1 UINT CSocketPrinter::ListeningThreadProc(LPVOID lparam)
             2 {
             3     //CFileWatcher* obj = (CFileWatcher*)lParam;
             4     CSocketPrinter::MonitorPara para = *((CSocketPrinter::MonitorPara*)lparam);
             5 
             6 
             7 }
             8 
             9 BOOL CSocketPrinter::StartMonitor(const MonitorPara &para)
            10 {
            11     CWinThread* pThread = AfxBeginThread(ListeningThreadProc, (LPVOID)&para);
            12 
            13     return (pThread && pThread->m_hThread);
            14 }

            調(diào)用線程.cpp文件中。
             1 CSocketPrinter obj;
             2 CSocketPrinter::MonitorPara para;
             3 
             4 HANDLE h_Thread = NULL;
             5 h_Thread  = obj.StartMonitor(para);
             6 
             7 if (!h_Thread)
             8 {
             9     LOG("獲取線程句柄出錯(cuò)");
            10     return;
            11 }

            強(qiáng)制結(jié)束線程
            1 ::TerminateThread(h_Thread, 0);
            posted @ 2012-04-26 13:35 王海光 閱讀(505) | 評(píng)論 (0)編輯 收藏
            64位操作系統(tǒng)下拷貝文件重定向問題

            問題:安裝打印機(jī)驅(qū)動(dòng)時(shí),系統(tǒng)拷貝驅(qū)動(dòng)文件到系統(tǒng)目錄C:\Windows\System32\spool\drivers,有的驅(qū)動(dòng)會(huì)出現(xiàn)安裝驅(qū)動(dòng)不成功的現(xiàn)象。
            原因:64位操作系統(tǒng)下沒有禁止重定向。
            在程序中加上下面代碼解決重定向問題。
            1 KWow64FsRedrt redrt;
            2 if (redrt.Init())
            3 {
            4     redrt.Close();
            5 }
            32位的Windows系統(tǒng)沒有重定向這個(gè)說法。

            其他文章http://blog.csdn.net/hcyang/article/details/4578796
                                   http://www.cnblogs.com/BeyondTechnology/archive/2010/10/21/1857881.html
            posted @ 2012-04-25 16:27 王海光 閱讀(641) | 評(píng)論 (0)編輯 收藏

            結(jié)構(gòu)體CString問題

            1 struct sTest
            2 {
            3     CString addr;
            4     int port;
            5 };

                 定義CString addr時(shí),編譯器會(huì)在棧里分配一塊內(nèi)存空間,然后調(diào)用CString的默認(rèn)構(gòu)造函數(shù)初始化addr,此時(shí)Cstring內(nèi)部的m_pchData指向一個(gè)空字串 " ",而不是NULL。cstring在結(jié)構(gòu)里也是一樣的,結(jié)構(gòu)無(wú)論是從棧中分配如 :
                 ME_REFRESH   lpmerefresh
                 或從堆中分配 :  
                 lpmerefresh=new   ME_REFRESH;
                 type為cstring的分量都會(huì)被調(diào)用默認(rèn)構(gòu)造函數(shù)初始化name,使Cstring內(nèi)部的m_pchData指向一個(gè)空字串 " ",該空字串是afxEmptyString的m_pchData。memset CString時(shí),該m_pchData便指向了NULL,那么就表明該CString的值被破壞了,所以報(bào)錯(cuò)。
                 結(jié)構(gòu)體成員如果僅僅是基本類型成員可以直接memset(ST,0,sizeof(ST)),但結(jié)構(gòu)體里面包含有指針,直接memset是不行的,因?yàn)橹羔槼蓡T的sizeof都是4字節(jié)。你應(yīng)該專門對(duì)指針成員進(jìn)行memset,sizeof對(duì)于包含指針的結(jié)構(gòu)獲得的長(zhǎng)度不是你想要的。

            posted @ 2012-04-24 13:56 王海光 閱讀(1864) | 評(píng)論 (0)編輯 收藏
            修改左上角的圖標(biāo)和任務(wù)欄里圖標(biāo)

                在對(duì)話框構(gòu)造函數(shù)中
            1 CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
            2     : CDialog(CTestDlg::IDD, pParent)
            3 {
            4     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
            5 }
                改過后:
            1 CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
            2     : CDialog(CTestDlg::IDD, pParent)
            3 {
            4     m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
            5 }
                將最后的IDR_MAINFRAME改為自己的圖標(biāo)即可,上面改為了IDI_ICON1,更改的圖標(biāo)需要先導(dǎo)入或者添加進(jìn)資源icon里,將默認(rèn)的mfc圖標(biāo)換成自己的。

            修改生成EXE文件圖標(biāo)

            方法一:
                要更改圖標(biāo),在resource.h中打開之后可以看到各個(gè)資源的ID值,一般mfc自動(dòng)生成的IDR_MAINFRAME是128,自己添加的會(huì)大于128,順序后延,編譯時(shí)默認(rèn)將ID最小的作為exe的圖標(biāo),所以只要我們將其改之就可以了,還是上面的對(duì)話框,將IDI_ICON1改為128,將IDR_MAINFRAME改為其他的大一點(diǎn)的數(shù)不能太大了,因?yàn)榭赡軙?huì)有其他用處,然后重新rebuild,這時(shí)就可以看到exe圖標(biāo)變成了自己的IDI_ICON1的圖標(biāo)了。

            方法二:
            1、在程序res文件夾下,刪除MFC圖標(biāo)文件,加入自己的圖標(biāo)文件;

            2、在圖標(biāo)IDR_MAINFRAME的屬性對(duì)話框中,修改File name路徑為自己的圖標(biāo)文件。

            注:(1)一定要先刪除原文件,否則會(huì)把你的圖標(biāo)文件覆蓋掉;

                  (2)完成后在資源視圖中可能發(fā)現(xiàn)還是原來(lái)的MFC圖標(biāo),但編譯后exe文件的圖標(biāo)已經(jīng)變成自己的了。

            方法三:
                在.rc文件中,可以修改默認(rèn)圖標(biāo)路徑來(lái)修改生成EXE文件圖標(biāo)。

            1 IDR_MAINFRAME           ICON                    "res\\Test.ico"

                修改后:

            1 IDR_MAINFRAME           ICON                    "res\\Test1.ico"


            修改托盤中EXE文件圖標(biāo)


            以用NOTIFYICONDATA來(lái)實(shí)現(xiàn)。

             1       NOTIFYICONDATA _tnd;
             2     _tnd.cbSize=sizeof(NOTIFYICONDATA);
             3     _tnd.hWnd  = this->GetSafeHwnd();
             4     _tnd.uID              = 0;
             5     _tnd.uFlags              = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_INFO;
             6     _tnd.dwInfoFlags      = NIIF_INFO; // add an icon to a balloon ToolTip
             7     _tnd.uTimeout = uTimeout;
             8 
             9     CString sStatusMsg = szMsg;
            10 
            11     if (“修改條件”)
            12     {
            13         _tnd.hIcon = theApp.LoadIcon(IDI_SUCCESSLOGIN);
            14     }

             

            posted @ 2012-04-20 15:52 王海光 閱讀(12224) | 評(píng)論 (0)編輯 收藏
            僅列出標(biāo)題
            共27頁(yè): First 19 20 21 22 23 24 25 26 27 
            色综合久久久久无码专区| 久久人妻无码中文字幕| 国产精品永久久久久久久久久| 国产成人无码精品久久久久免费| 国产成人综合久久精品尤物| 亚洲午夜福利精品久久| 国内精品综合久久久40p| 99久久人妻无码精品系列| 国产精品亚洲美女久久久| 一本大道久久东京热无码AV| 久久99国产综合精品| 久久91精品综合国产首页| 精品国产青草久久久久福利| 久久久久国产精品| 久久精品国产男包| 久久99国产精品99久久| 四虎影视久久久免费| 无码人妻久久久一区二区三区| 国产 亚洲 欧美 另类 久久| 久久99精品久久久大学生| 国产精品久久久久久久午夜片| 欧美日韩精品久久久免费观看| 久久噜噜电影你懂的| 亚洲精品无码成人片久久| 精品国产综合区久久久久久| 久久综合香蕉国产蜜臀AV| 蜜桃麻豆www久久国产精品| av午夜福利一片免费看久久| 无码任你躁久久久久久久| 久久成人精品视频| 日产精品99久久久久久| 人妻少妇精品久久| 久久久91精品国产一区二区三区| 久久99热这里只有精品国产| 久久中文字幕视频、最近更新| 99久久99久久| 亚洲AV无码久久寂寞少妇| 欧美精品九九99久久在观看| 精品久久久无码中文字幕| 久久夜色精品国产亚洲| 久久午夜无码鲁丝片|