青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

面對現實,超越自己
逆水行舟,不進則退
posts - 269,comments - 32,trackbacks - 0
MFC 類型轉換

一、CString與LPSTR、LPCSTR、string、 char*相互轉換

1. CString轉換成LPSTR:
方法一:   
1  CString strFileName;    
2  LPSTR lpStr = strFileName.GetBuffer();  
3  strFileName.ReleaseBuffer();  
方法二:     
1 CString strFileName;   
2  LPSTR lpStr = (LPSTR)(LPCSTR)strFimeName;
3 

2. LPSTR轉換成CString:

1 LPSTR lpStr = _T("TestStr");   
2 CString str(lpStr);   
3 //注意:CString和LPCSTR可直接轉換,如下:   
4 CString str;   
5 LPCSTR lpcStr = (LPCSTR)str;

CString轉換成LPSTR:
CString strTemp;
LPTSTR pSterTemp = strTemp.GetBuffer();  //這會為pSetTemp指向的字符串分配內存,同時會把strTemp的內容拷貝下來。。
strTemp.ReleaseBuffer();  //must call this funtion. 歸還內存給操作系統。

或:
LPTSTR pSterTemp = (LPTSTR)(LPCSTR)strTemp;

3.string 轉 CString  
1 CString.format("%s"string.c_str());

4.CString 轉 string 

1 string s(CString.GetBuffer(CString.GetLength()));

5. CString轉char*

(1)傳給未分配內存的const char* (LPCTSTR)指針.      

1 CString cstr(asdd);
2 const char* ch = (LPCTSTR)cstr;
3 //ch指向的地址和cstr相同。但由于使用const保證ch不會修改,所以安全.

 

(2)傳給未分配內存的指針.   

CString cstr = "ASDDSD";
char *ch = cstr.GetBuffer(cstr1.GetLength() + 1);
cstr.ReleaseBuffer();
//修改ch指向的值等于修改cstr里面的值.
//PS:用完ch后,不用delete ch,因為這樣會破壞cstr內部空間,容易造成程序崩潰.

(3)第二種用法。把CString 值賦給已分配內存的char *.

1 CString cstr1 = "ASDDSD";
2 int strLength = cstr1.GetLength() + 1;
3 char *pValue = new char[strLength];
4 strncpy(pValue, cstr1, strLength);

(4)第三種用法.把CString 值賦給已分配內存char[]數組.

1 CString cstr2 = "ASDDSD";
2 int strLength1 = cstr1.GetLength() + 1;
3 char chArray[100];
4 memset(chArray,0sizeof(bool* 100); //將數組的垃圾內容清空.

 6、char * 轉 CString  

1 CString.format("%s"char*);

      
二、string與char*轉換

1、char * 轉 string 

1 string s(char *);

 2、string 轉 char *        

1 char *= string.c_str();


三、CString轉換到TCHAR *
1、使用強制轉換。例如:

1 CString theString( "This is a test" );
2 LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;

2、使用strcpy。例如:

1 CString theString( "This is a test" );
2 LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
3 _tcscpy(lpsz, theString); 
4 
5 //需要說明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二個參數是 const wchar_t* (Unicode)或const char* (ANSI),系統編譯器將會自動對其進行轉換。

3、使用CString::GetBuffer。例如:

1 CString s(_T("This is a test "));
2 LPTSTR p = s.GetBuffer();
3 // 在這里添加使用p的代碼
4 if(p != NULL) *= _T('\0');
5     s.ReleaseBuffer(); 
6 // 使用完后及時釋放,以便能使用其它的CString成員函數


四、stringwstring

1     wchar_t wcs[100], wc;
2 
3     string testStr1="1234567890";
4 
5     setlocale(LC_CTYPE, "");  //很重要,沒有這一句,轉換會失敗
6 
7     mbstowcs(wcs, testStr1.c_str(), 99);
8 
9     wstring testStr(wcs);
  
#include <string>
std::string ws2s(const std::wstring& ws)
{
    std::string curLocale = setlocale(LC_ALL, NULL);        // curLocale = "C";
    setlocale(LC_ALL, "chs");
    const wchar_t* _Source = ws.c_str();
    size_t _Dsize = 2 * ws.size() + 1;
    char *_Dest = new char[_Dsize];
    memset(_Dest,0,_Dsize);
    wcstombs(_Dest,_Source,_Dsize);
    std::string result = _Dest;
    delete []_Dest;
    _Dest = NULL;
    setlocale(LC_ALL, curLocale.c_str());
    return result;
}

std::wstring s2ws(const std::string& s)
{
    setlocale(LC_ALL, "chs"); 
    const char* _Source = s.c_str();
    size_t _Dsize = s.size() + 1;
    wchar_t *_Dest = new wchar_t[_Dsize];
    wmemset(_Dest, 0, _Dsize);
    mbstowcs(_Dest,_Source,_Dsize);
    std::wstring result = _Dest;
    delete []_Dest;
    _Dest = NULL;
    setlocale(LC_ALL, "C");
    return result;
}

C語言庫函數名: atoi   功 能: 把字符串轉換成整型數
函數名: atof   功 能: 把字符串轉換成浮點數

CString與Byte數組相互轉換

 CString cs1 = "gettruckpos";

 byte buf[200];

 memcpy(buf,cs1.GetBuffer(cs1.GetLength()),cs1.GetLength());  //將cstring放入byte數組

 CString *pPhoneNum =new CString((char*)buf, cs1.GetLength()); //將byte數組轉換成cstring

 CString cs2 = *pPhoneNum;

int轉byte
//int轉byte
void  intToByte(int i,byte *bytes,int size = 4)
{
    byte[] bytes = new byte[4];
    memset(bytes,0,sizeof(byte) *  size);
    bytes[0] = (byte) (0xff & i);
    bytes[1] = (byte) ((0xff00 & i) >> 8);
    bytes[2] = (byte) ((0xff0000 & i) >> 16);
    bytes[3] = (byte) ((0xff000000 & i) >> 24);
    return ;
 }

BYTE*  IntToBytes(int nNum, BOOL isHighFirst, BYTE *pVal)
{
    BYTE result[4] = {0};

    if (isHighFirst)
    {
        result[0]  = (BYTE)(nNum >> 24 & 0xff);
        result[1]  = (BYTE)(nNum >> 16 & 0xff);
        result[2]  = (BYTE)(nNum >> 8 & 0xff);
        result[3]  = (BYTE)(nNum & 0xff);
    }
    else
    {
        result[3]  = (BYTE)(nNum >> 24 & 0xff);
        result[2]  = (BYTE)(nNum >> 16 & 0xff);
        result[1]  = (BYTE)(nNum >> 8 & 0xff);
        result[0]  = (BYTE)(nNum & 0xff);
    }

    memcpy(pVal, result, 4);

    return result;
}

byte轉int
//byte轉int
int bytesToInt(byte* bytes,int size = 4) 
{
    int addr = bytes[0] & 0xFF;
    addr |= ((bytes[1] << 8) & 0xFF00);
    addr |= ((bytes[2] << 16) & 0xFF0000);
    addr |= ((bytes[3] << 24) & 0xFF000000);
    return addr;
 }

CString轉 wchar_t*
wchar_t * CCommonFun::ConvertCStringToWchar_t(CString &str)
{
    CString sTemp = str;
    const char* CStr = (LPCTSTR)sTemp;

    size_t len = strlen(CStr) + 1;
    size_t converted = 0;
    wchar_t *WStr;
    WStr = (wchar_t*)malloc(len*sizeof(wchar_t));
    mbstowcs_s(&converted, WStr, len, CStr, _TRUNCATE);

    return WStr;
}
 注意:可以在調用的地方釋放分配的內存,如果遇到漢子轉換亂碼問題可以在轉換前使用setlocale(LC_ALL, "chs")或者setlocale(LC_ALL,"zh_CN.UTF-8")進行設置

wchar_t*轉CString
CString  CTestTextToPicDlg::ConvertWchar_tToCString(const wchar_t* WStr)
{
    size_t len = wcslen(WStr) + 1;
    size_t converted = 0;
    char *CStr;
    CStr=(char*)malloc(len*sizeof(char));
    wcstombs_s(&converted, CStr, len, WStr, _TRUNCATE);
    CString sTemp;
    sTemp.Format("%s", CStr);

    free(CStr);
    CStr = NULL;

    return sTemp;
}

TCHAR和char的區別:

C++支持兩種字符串,即常規的ANSI編碼(使用""包裹)和Unicode編碼(使用L""包裹),這樣對應的就有了兩套字符串字符串處理函數,比如:strlen和wstrlen,分別用于處理兩種字符串。

 

由于字符編碼的不同,在C++中有三種對于字符類型:char, wchar_t , TCHAR。其實TCHAR不能算作一種類型,他緊緊是一個宏。我們都知道,宏在預編譯的時候會被替換成相應的內容。TCHAR 在使用多字節編碼時被定義成char,在Unicode編碼時定義成wchar_t。
如果你希望同時為ANSI和Unicode編譯的源代碼,那就要include TChar.h。TCHAR是定義在其中的一個宏,它視你是否定義了_UNICODE宏而定義成char或者wchar_t。如果你使用了TCHAR,那么就不應該使用ANSI的strXXX函數或者Unicode的wcsXXX函數了,而必須使用TChar.h中定義的_tcsXXX函數。另外,為了解決剛才提到帶“L”的問題,TChar.h中定義了一個宏:“_TEXT”。

 以strcpy函數為例子,總結一下:
 .如果你想使用ANSI字符串,那么請使用這一套寫法:
 char szString[100];
 strcpy(szString,"test");
 .如果你想使用Unicode字符串,那么請使用這一套:
 wchar_t szString[100];
 wcscpyszString,L"test");
 .如果你想通過定義_UNICODE宏,而編譯ANSI或者Unicode字符串代碼:
 TCHAR szString[100];
 _tcscpy(szString,_TEXT("test"));

使用TCHAR系列方案編寫程序
    TCHAR是一種字符串類型,它讓你在以MBCS和UNNICODE來build程序時可以使用同樣的代碼,不需要使用繁瑣的宏定義來包含你的代碼。 
      TCHAR的引入,主要是在Tchar.h文件中,該文件包含這方面的重要的定義信息。
      對于包含了對str函數或wcs函數進行顯式調用的代碼來說,無法非常容易地同時為ANSI和Unicode對這些代碼進行編譯。本章前面說過,可以創建同時為ANSI和Unicode進行編譯的單個源代碼文件。若要建立雙重功能,必須包含TChar.h文件,而不是包含String.h文件。
      TChar.h文件的唯一作用是幫助創建ANSI/Unicode通用源代碼文件。它包含你應該用在源代碼中的一組宏,而不應該直接調用str函數或者 wcs函數。如果在編譯源代碼文件時定義了_UNICODE,這些宏就會引用wcs這組函數。如果沒有定義_UNICODE,那么這些宏將引用str這組宏。
      TCHAR的定義如下:
      #ifdef UNICODE
      typedef wchar_t TCHAR;
      #else
      typedef char TCHAR;
      #endif
      所以用MBCS來build時,TCHAR是char,使用UNICODE時,TCHAR是wchar_t。
      還有一個宏來處理定義Unicode字符串常量時所需的L前綴。
      #ifdef UNICODE
      #define _T(x) L##x
      #define _TEXT(x) L##x
      #define __T(x) L##x
      #else
      #define _T(x) x
      #define _TEXT(x) x
      #define __T(x) x
      #endif
     ## 是一個預處理操作符,它可以把兩個參數連在一起。如果你的代碼中需要字符串常量,在它前面加上_T宏。如果你使用Unicode來build,它會在字符串常量前加上L前綴。
      TCHAR szNewText[] = _T("we love Bob!");
    _UNICODE宏用于C運行期頭文件,而UNICODE宏則用于Windows頭文件。當編譯源代碼模塊時,通常必須同時定義這兩個宏。
  像是用宏來隱藏SetWindowTextA/W的細節一樣,還有很多可以供你使用的宏來實現str***()和_mbs***()等字符串函數。例如,你可以使用_tcsrchr宏來替換strrchr()、_mbsrchr()和wcsrchr()。_tcsrchr根據你預定義的宏是_MBCS還是 UNICODE來擴展成正確的函數,就象SetWindowText所作的一樣。
   不僅str***()函數有TCHAR宏。其他的函數如, _stprintf(代替sprinft()和swprintf()),_tfopen(代替fopen()和_wfopen())。 MSDN中"Generic-Text Routine Mappings."標題下有完整的宏列表。

QT類型轉換

QString轉char*

Qstring  str;

char*  ch;

QByteArray ba = str.toLatin1();    

ch=ba.data();

 

這樣就完成了QString向char*的轉化。經測試程序運行時不會出現bug

注意第三行,一定要加上,不可以str.toLatin1().data()這樣一部完成,可能會出錯。

補充:以上方法當QString里不含中文時,沒有問題,但是QString內含有中文時,轉換為char*就是亂碼,采用如下方法解決:

方法1:

添加GBK編碼支持:

#include <QTextCodec>

QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

然后改變上面的第三行為:QByteArray ba = str.toLoacl8Bit();      toLoacl8Bit支持中文

方法2:

先將QString轉為標準庫中的string類型,然后將string轉為char*,如下:

std::string str = filename.toStdString();

const char* ch = str.c_str();

 

posted @ 2012-04-06 17:08 王海光 閱讀(1018) | 評論 (0)編輯 收藏
轉自:http://apps.hi.baidu.com/share/detail/6937479

對于類似從給定的文本中,查找其中最長的重復子字符串的問題,可以采用“后綴數組”來高效地完成此任務。后綴數組使用文本本身和n個附加指針(與文本數組相應的指針數組)來表示輸入文本中的n個字符的每個子字符串。
    首先,如果輸入字符串存儲在c[0..n-1]中,那么就可以使用類似于下面的代碼比較每對子字符串:
    maxlen = -1
    for i = [0, n)
        for j = (i, n)
            if (thislen = comlen(&c[i], &c[j])) > maxlen
                maxlen = thislen
                maxi = i
                maxj = j
    當作為comlen函數參數的兩個字符串長度相等時,該函數便返回這個長度值,從第一個字符開始:
    int comlen(char *p, char* q)
        i = 0
        while *p && (*p++ = *q++)
            i++
        return i
    由于該算法查看所有的字符串對,所以它的時間和n的平方成正比。下面便是使用“后綴數組”的解決辦法。
    如果程序至多可以處理MAXN個字符,這些字符被存儲在數組c中:
    #define MAXN 5000000
    char c[MAXN], *a[MAXN];
    在讀取輸入時,首先初始化a,這樣,每個元素就都指向輸入字符串中的相應字符:
    while (ch = getchar()) != EOF
  a[n] = &c[n];
  c[n++] = ch;
 c[n] = 0 //將數組c中的最后一個元素設為空字符,以終止所有字符串。
 這樣,元素a[0]指向整個字符串,下一個元素指向以第二個字符開始的數組的后綴,等等。如若輸入字符串為"banana",該數組將表示這些后綴:
 a[0]:banana
 a[1]:anana
 a[2]:nana
 a[3]:ana
 a[4]:na
 a[5]:a
 由于數組a中的指針分別指向字符串中的每個后綴,所以將數組a命名為"后綴數組"
 第二,對后綴數組進行快速排序,以將后綴相近的(變位詞)子串集中在一起
 qsort(a, n, sizeof(char*), pstrcmp)后
 a[0]:a
 a[1]:ana
 a[2]:anana
 a[3]:banana
 a[4]:na
 a[5]:nana
 第三,使用以下comlen函數對數組進行掃描比較鄰接元素,以找出最長重復的字符串:
 for i = [0, n)
     if comlen(a[i], a[i+1]) > maxlen
         maxlen = comlen(a[i], a[i+1])
         maxi = i
 printf("%.*s/n", maxlen, a[maxi])
 由于少了內層循環,只是多了一次排序,因此該算法的運行時間為O(n logn). 

完整代碼如下:
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 #define MAXCHAR 5000 //最長處理5000個字符
 6 
 7 char c[MAXCHAR], *a[MAXCHAR];
 8 
 9 int comlen( char *p, char *q )
10 {
11     int i = 0;
12     while*&& (*p++ == *q++) )
13         ++i;
14     return i;
15 }
16 
17 int pstrcmp( const void *p1, const void *p2 )
18 {
19     return strcmp( *(char* const *)p1, *(char* const*)p2 );
20 }
21 
22 int main( )
23 {
24     char ch;
25     int n=0;
26     int i, temp;
27     int maxlen=0, maxi=0;
28     printf("Please input your string:\n");
29     while( (ch=getchar())!='\n' )
30    {
31         a[n]=&c[n];
32         c[n++]=ch;
33     }
34     c[n]='\0';
35     qsort( a, n, sizeof(char*), pstrcmp );
36     for(i=0; i<n-1++i )
37    {
38         temp=comlen( a[i], a[i+1] );
39         if( temp>maxlen )
40         {
41             maxlen=temp;
42             maxi=i;
43         }
44     }
45     printf("%.*s\n",maxlen, a[maxi]);
46     system("PAUSE");
47     return 0;
48 }

posted @ 2012-03-30 13:03 王海光 閱讀(743) | 評論 (0)編輯 收藏

編程珠璣第二版快速排序

 1 qsort4(0, n-1);
 2 isort3();
 3 
 4 void qsort4(l, u)
 5 {  
 6      if (u - l < cutoff)               //cutoff是一個小整數,如果要排序的數組很小,可以用插入排序,速度更快
 7         return;
 8        swap(L, randint(l, u))      //將第一個數據與后面的數據隨即交換,避免要排序的數據已是升序排列或者第一個數據很小
 9        t = x[l];                            //t為中間元素,所有數據與其進行比較,小于t的放到左邊,大于t的放到右邊
10        i = l;
11       j = u+1;
12       loop
13               do 
14               {
15                      i++;
16               } while (i <= u && x[i] < t);     //從第二個數據開始比較,遇到大于t的數據終止循環
17 
18               do 
19               {
20                      j--;
21                } while (x[j] > t);     //從最后一個數據進行比較,遇到小于t的終止循環
22 
23               if (i > j)          //如果i>j,數據分組成功,跳出循環
24                      break;
25               temp = x[i];    //交換上面兩個循環終止時的數據
26               x[i] = x[j];
27               x[j] = temp;
28 
29        swap(l, j);           //交換x[i]與x[j]的值,分組完成
30        qsort4(l, j-1);     //排序小于t的數據
31        qsort4(j+1, u);   //排序大于t的數據 
32 }
33 
34 void isort3() //插入排序,當排序的數據很少時可以用此排序
35 {
36        int i,j;
37        for i = [l, n)
38            t = x[i];
39            for (j=i; j>0 && x[j-1]>t; j--)
40            {
41                   x[j] = x[j-1];
42            }
43            x[j] = t;
44   }


轉自:http://www.shnenglu.com/humanchao/archive/2008/08/18/59241.html

void QuickSort(int* pData,int left,int right)
{
    
int i = left, j = right;
    
int middle = pData[(left+right)/2];        // midlle value
    int iTemp;
    
do
    {    
        
while (pData[i] < middle && i < right)            i++;
        
while (pData[j] > middle && j > left)            j--;
        
if (i < j)                            // swap
        {
            iTemp    
= pData[i];
            pData[i] 
= pData[j];
            pData[j] 
= iTemp;
            i
++;            j--;
        } 
        
else if (i == j)
        {
            i
++;            j--;
        }
    } 
while (i < j);

    
if (left  < j)        QuickSort(pData,left,j);
    
if (right > i)        QuickSort(pData,i,right);
}

 

堆排序實現原理

轉自:http://www.nowamagic.net/algorithm/algorithm_HeapSortStudy.php


堆排序
C語言描述

  
 1 // array是待調整的堆數組,i是待調整的數組元素的位置,nlength是數組的長度 
 2   void HeapAdjust(int array[],int i,int nLength) //本函數功能是:根據數組array構建大根堆 
 3   { 
 4         int nChild; 
 5         int nTemp; 
 6         for (nTemp = array[i]; 2 * i + 1 < nLength; i = nChild) 
 7         { 
 8               // 子結點的位置=2*(父結點位置)+ 1 
 9               nChild = 2 * i + 1
10               // 得到子結點中較大的結點 
11               if (nChild < nLength - 1 && array[nChild + 1> array[nChild]) 
12               ++nChild; 
13               // 如果較大的子結點大于父結點那么把較大的子結點往上移動,替換它的父結點 
14               if (nTemp < array[nChild]) 
15               { 
16                     array[i]= array[nChild]; 
17               } 
18               else // 否則退出循環 
19               { 
20                     break
21               } 
22               // 最后把需要調整的元素值放到合適的位置 
23               array[nChild]= nTemp; 
24         } 
25   } 
26   // 堆排序算法 
27   void HeapSort(int array[],int length) 
28   { 
29           // 調整序列的前半部分元素,調整完之后第一個元素是序列的最大的元素 
30         for (int i = length / 2 - 1; i >= 0--i) 
31         { 
32               HeapAdjust(array,i,length); 
33         } 
34         // 從最后一個元素開始對序列進行調整,不斷的縮小調整的范圍直到第一個元素 
35         for (int i = length - 1; i > 0--i) 
36         { 
37               // 把第一個元素和當前的最后一個元素交換, 
38               // 保證當前的最后一個位置的元素都是在現在的這個序列之中最大的 
39               Swap(&array[0],&array[i]); 
40               // 不斷縮小調整heap的范圍,每一次調整完畢保證第一個元素是當前序列的最大值 
41               HeapAdjust(array,0,i); 
42         } 
43   } 
堆排序算法(C++描述)
 1 #define MAX 100//數據元素的最大個數 
 2   typedef struct 
 3   { 
 4         int r[MAX]; 
 5         int length; 
 6   }SqList;//定義一個線性表用于存放數據元素 
 7   void HeapAdjust(SqList &L,int s,int m) 
 8   {
 9             //已知L.r[sm]中記錄除L.r[s]外均滿足堆的定義,本函數用于使L.r[sm]成為一個大頂堆 
10         int j; 
11         int e=L.r[s]; 
12         for(j=2*s;j<=m;j*=2
13         { 
14               if(j<M&&L.R[J]<L.R[J+1]) ++j; 
15               if(e>=L.r[j]) break
16               L.r[s]=L.r[j]; 
17               s=j; 
18         } 
19         L.r[s]=e; 
20   } 
21   void HeapSort(SqList &L) 
22   {
23             //對順序表L進行堆排序 
24         int i,e; 
25         for(i=L.length/2;i>0;i--
26               HeapAdjust(L,i,L.length); 
27         for(i=L.length;i>1;i--
28         {
29                   //將大頂堆的頂記錄和最后一個記錄相互交換 
30               e=L.r[1]; 
31               L.r[1]=L.r[i]; 
32               L.r[i]=e; 
33               HeapAdjust(L,1,i-1); 
34         } 
35   } 
posted @ 2012-03-30 12:47 王海光 閱讀(622) | 評論 (0)編輯 收藏
     摘要: 一、查看是否有優盤插入 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1 #define MESSAGEBOX_TITLE    "標題"2 #define PLEAS...  閱讀全文
posted @ 2012-03-14 14:01 王海光 閱讀(1155) | 評論 (0)編輯 收藏
轉自:http://blog.csdn.net/blueblood7/article/details/7193573


用 NSIS制作64位安裝包 步驟

1、在安裝腳本的開始處定義 LIBRARY_X64。

!include "MUI.nsh"
!include "Library.nsh"

;如果做32位安裝包就把下句注釋。
!define LIBRARY_X64

 

2、注冊COM組件,需包含Library.nsh,用宏InstallLib/UnInstallLib 代替RegDLL/UnRegDLL。

;RegDLL "$SYSDIR\ComName.dll"
!insertmacro InstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED "LocalPath\ComName.dll" "$SYSDIR\ComName.dll" $SYSDIR

;UnRegDLL "$SYSDIR\ComName.dll"
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED "$SYSDIR\ComName.dll"

 

3、在調用涉及注冊表的函數前用 SetRegView 64,后用 SetRegView lastused。

!ifdef  LIBRARY_X64
 SetRegView 64
!endif

 WriteRegStr ...
 WriteRegStr ...
 WriteRegStr ...

!ifdef  LIBRARY_X64
 SetRegView lastused
!endif 

SetRegView用戶手冊:
在 Windows x64 上共有2種查看方式。一種用于 32-bit 應用程序,另一種用于 x64 應用程序。默認情況下,32-bit 應用程序運行在 x64 系統的 WOW64 模式下時,只允許使用 32-bit 查看方式。使用 SetRegView 64 將允許安裝程序在 x64 中訪問注冊表鍵值。

它將影響
DeleteRegKey,
DeleteRegValue,
EnumRegKey,
EnumRegValue,
ReadRegDWORD
,
ReadRegStr
,
WriteRegBin
,
WriteRegDWORD
,
WriteRegStr
,
WriteRegExpandStr

它不會影響 InstallDirRegKey。另外,在函數 .onInit 中也可使用 ReadRegStr 讀取注冊表。

SetRegView 32
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
DetailPrint $0 # prints C:\Program Files (x86)
SetRegView 64
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
DetailPrint $0 # prints C:\Program Files
Function .onInit
  SetRegView 64
  ReadRegStr $INSTDIR HKLM Software\NSIS ""
  SetRegView 32
FunctionEnd

4、在調用涉及目標機器上系統目錄(即$SYSDIR)的函數前用 ${DisableX64FSRedirection}。

在安裝包的第一個Section中調用一次即可。
!ifdef  LIBRARY_X64
 ${DisableX64FSRedirection}
!endif 

 

5、在64位系統上 $PROGRAMFILES64 表示“Program Files”, $PROGRAMFILES 表示 “Program Files (x86)”。

可以在安裝腳本的開始處定義一個常量,
!ifdef LIBRARY_X64
!define PROGRAM_FILES_MAP  $PROGRAMFILES64
!else
!define PROGRAM_FILES_MAP  $PROGRAMFILES
!endif
以后直接用 ${PROGRAM_FILES_MAP} 代替 $PROGRAMFILES。

 

6、在.onInit 和 un.onInit 中判斷一下,如果安裝包是在32位操作系統上運行,則停止安裝。

可創建一個宏,然后在需要的地方插入。
!macro TIP_WHEN_AMD64_INSTALLER_RUNAT_X86
 !ifdef LIBRARY_X64
  ${If} ${RunningX64}
  ${else}
     MessageBox MB_OK|MB_ICONINFORMATION "請在64位操作系統下運行。"
   Abort
  ${EndIf}
 !endif
!macroend

Function .onInit
 !insertmacro TIP_WHEN_AMD64_INSTALLER_RUNAT_X86
 SetShellVarContext all  ;安裝到所有用戶下,current 表示安裝到當前用戶下, all 表示所有用戶下。
FunctionEnd

Function un.onInit
 !insertmacro TIP_WHEN_AMD64_INSTALLER_RUNAT_X86
 SetShellVarContext all
FunctionEnd

 

備注:
1、在 NSIS 中的條件編譯是 !開頭,不是 #開頭,如!ifdef。
2、對COM組件,我認為應該是使用 NOTSHARED 方式注冊。
3、可以做個批處理文件,一次性生成32位/64位的安裝包。
 如 x.bat
 rem "記得要把安裝腳本中的 !define LIBRARY_X64 注釋掉,否則不能生成32位安裝包。"
 makensis .\myinstaller.nsi
 makensis /DLIBRARY_X64 .\myinstaller.nsi
 pause
 

posted @ 2012-03-08 12:51 王海光 閱讀(6265) | 評論 (0)編輯 收藏

 

 1 //獲取xml文件路徑
 2 CString sXmlPath = CCommonFun::GetExecutablePath() + "420120223165116971.pcl.xml";
 3  
 4 TiXmlDocument* pXmlDoc = new TiXmlDocument(sXmlPath);
 5 //導入xml文件
 6 pXmlDoc->LoadFile();
 7 
 8 //獲取根節點
 9 TiXmlElement *xmlRootElement = pXmlDoc->RootElement();
10 
11 //創建新節點
12 TiXmlElement *x1 = new TiXmlElement("WaterMarks");
13 xmlRootElement->LinkEndChild(x1);
14 
15 //創建新節點下的子節點
16 TiXmlElement *nameElement = new TiXmlElement("WaterMark");
17 //設置子節點屬性
18 nameElement->SetAttribute("copies""1");
19 nameElement->SetAttribute("type""1");
20 
21 //創建新節點下的子節點
22 TiXmlElement *ageElement = new TiXmlElement("WaterMark");
23 ageElement->SetAttribute("copies""2");
24 ageElement->SetAttribute("type""1");
25 x1->LinkEndChild(nameElement);
26 x1->LinkEndChild(ageElement);
27 
28         //  TiXmlText *nameContent = new TiXmlText("aaa");
29         //     TiXmlText *ageContent = new TiXmlText("12");
30        //  nameElement->LinkEndChild(nameContent);
31        //  ageElement->LinkEndChild(ageContent);
32 
33 //保存xml文件
34  pXmlDoc->SaveFile(sXmlPath);

 

posted @ 2012-03-06 15:26 王海光 閱讀(1834) | 評論 (0)編輯 收藏
來自:http://blog.csdn.net/s3c44b0x/article/details/5469269

方法一:在對話框的屬性中,在more   style中有一項是System   model,選上它,即可!
方法二:OnInitDialog里加入SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

外部調用: m_dialog->SetWindowPos(&wndTopMost, 0, 0, 400, 400, SWP_SHOWWINDOW);

 

MFC彈出非模態對話框

新建對話框IDD_DIALOG_TEST

用向導新建相應的類CTestDialog

在文件頭#include “TestDialog.h”

 
CTestDialog *pTestDlg = new CTestDialog();
pTestDlg->Create(IDD_DIALOG_TEST, this);
pTestDlg->ShowWindow(SW_SHOW);

 

窗口保持在最前方

SetWindowPos(&wndTopMost,110,108,811,491,SWP_SHOWWINDOW);//這是標準位置

銷毀窗口

pTestDlg->Destroy Windows;

delet pTestDlg;

posted @ 2012-03-02 10:08 王海光 閱讀(5353) | 評論 (0)編輯 收藏

大家在啟動服務器時,有時正常啟動有時又啟動不了是怎么回事呢??那為什么關掉迅雷等軟件就又好了呢??現在就來給大家講解一下,

如何查詢端口被占用的程序 - kakis - Kakis

轉自:http://yinkai210.blog.163.com/blog/static/287483452009050256466/

這些端口如果被其他程序占用就不能正常啟動,比如有時啟動時會提示WEB啟動失敗,其實就是80端口被占用了,而迅雷等下載軟件恰恰就是占用了80端口,關掉就行了。但有時迅雷等都沒有開也啟動不了,那就是別的東西占用了,那怎么辦呢?我來叫你查看端口并關掉的方法。
1.在開始--運行   里面輸入cmd點回車,會出現運行窗口。
2.在提示符后輸入netstat -ano回車,找到tcp 80端口對應的pid,比如1484.
3.ctrl+alt+del打開任務管理器,選進程,這里有很多正在運行的程序怎么找?別急點上面的   查看--選擇列--在PID(進程標示符)前面打鉤。好了,下面的進程前面都有了PID號碼。這時上一步找到的PID就有用了,找到1484,比如PEER.EXE什么的,結束進程吧。這時再開服務器,看WEB可以啟動了!

如上面的不清楚還有簡明的:

假如我們需要確定誰占用了我們的80端口

1、Windows平臺
在windows命令行窗口下執行:
C:\>netstat -aon|findstr "80"
TCP     127.0.0.1:80         0.0.0.0:0               LISTENING       2448
看到了嗎,端口被進程號為2448的進程占用,繼續執行下面命令:
C:\>tasklist|findstr "2448"
thread.exe                     2016 Console                 0     16,064 K
很清楚吧,thread占用了你的端口,Kill it
如果第二步查不到,那就開任務管理器,看哪個進程是2448,然后殺之即可。

如果需要查看其他端口。把 80 改掉即可

Linux查看端口使用狀態、關閉端口方法
轉自:http://blog.csdn.net/wudiyi815/article/details/7473097
前提:首先你必須知道,端口不是獨立存在的,它是依附于進程的。某個進程開啟,那么它對應的端口就開啟了,進程關閉,則該端口也就關閉了。下次若某個進程再次開啟,則相應的端口也再次開啟。而不要純粹的理解為關閉掉某個端口,不過可以禁用某個端口。

1. 可以通過"netstat -anp" 來查看哪些端口被打開。
(注:加參數'-n'會將應用程序轉為端口顯示,即數字格式的地址,如:nfs->2049, ftp->21,因此可以開啟兩個終端,一一對應一下程序所對應的端口號)
2. 然后可以通過"lsof -i:$PORT"查看應用該端口的程序($PORT指對應的端口號)。或者你也可以查看文件/etc/services,從里面可以找出端口所對應的服務。
(注:有些端口通過netstat查不出來,更可靠的方法是"sudo nmap -sT -O localhost")
3. 若要關閉某個端口,則可以:
1)通過iptables工具將該端口禁掉,如:
 "sudo iptables -A INPUT -p tcp --dport $PORT -j DROP"
 "sudo iptables -A OUTPUT -p tcp --dport $PORT -j DROP"    
2)或者關掉對應的應用程序,則端口就自然關閉了,如:
 "kill -9 PID" (PID:進程號)
  如:    通過"netstat -anp | grep ssh"
  有顯示:    tcp 0 127.0.0.1:2121 0.0.0.0:* LISTEN 7546/ssh
  則:    "kill -9 7546"

(可通過"chkconfig"查看系統服務的開啟狀態)

posted @ 2012-02-22 17:06 王海光 閱讀(1033) | 評論 (0)編輯 收藏
(一) 原理
  1、最小化的原理:首先要將窗口隱藏,然后在右下角繪制圖標。
  2、恢復的原理:將窗口顯示,再將托盤中的圖片刪除。

(二)程序實現
  1、自定義消息WM_SHOWTASK: 

1 #define WM_SHOWTASK (WM_USER +1)

 

   2、在MFC的 

1 ::OnSysCommand(UINT nID, LPARAM lParam) 函數體中增加一個命令響應
2 if(nID==SC_MINIMIZE)
3 ToTray(); //最小化到托盤的函數

   3、在消息映射中添加  

1 ON_MESSAGE(WM_SHOWTASK,OnShowTask); //其中WM_SHOWTASK是消息名,
2 OnShowTask是自己定義的消息響應函數,后面有說明。

(三)具體函數內容
1、最小化到托盤函數 

 1 void CMyDlg::ToTray()
 2 {
 3   NOTIFYICONDATA nid;
 4   nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
 5   nid.hWnd=this->m_hWnd;
 6   nid.uID=IDR_MAINFRAME;
 7   nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
 8   nid.uCallbackMessage=WM_SHOWTASK;//自定義的消息名稱
 9   nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
10   strcpy(nid.szTip,"程序名稱"); //信息提示條
11   Shell_NotifyIcon(NIM_ADD,&nid); //在托盤區添加圖標
12   ShowWindow(SW_HIDE); //隱藏主窗口
13 }

 

2、恢復界面函數

 1 在頭文件中定義消息響應函數
 2 afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;
 3 //wParam接收的是圖標的ID,而lParam接收的是鼠標的行為
 4 LRESULT CMyDlg::OnShowTask(WPARAM wParam,LPARAM lParam)
 5 {
 6   if(wParam!=IDR_MAINFRAME)
 7   return 1;
 8   switch(lParam)
 9   {
10       case WM_RBUTTONUP://右鍵起來時彈出快捷菜單,這里只有一個“關閉”
11   {
12       LPPOINT lpoint=new tagPOINT;
13       ::GetCursorPos(lpoint);//得到鼠標位置
14       CMenu menu;
15       menu.CreatePopupMenu();//聲明一個彈出式菜單
16       menu.AppendMenu(MF_STRING,WM_DESTROY,"關閉"); //增加菜單項“關閉”,點擊則發送消息  WM_DESTROY給主窗口(已隱藏),將程序結束。
17       menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); //確定彈出式菜單的位置
18       HMENU hmenu=menu.Detach();
19       menu.DestroyMenu(); //資源回收
20       delete lpoint;
21   } break;
22   case WM_LBUTTONDBLCLK: //雙擊左鍵的處理
23   {
24       this->ShowWindow(SW_SHOW);//簡單的顯示主窗口完事兒
25       DeleteTray();
26   } break;
27   defaultbreak;
28   }
29       return 0;
30   }

3、刪除托盤圖標函數 

 1 void CMyDlg::DeleteTray()
 2 {
 3   NOTIFYICONDATA nid;
 4   nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
 5   nid.hWnd=this->m_hWnd;
 6   nid.uID=IDR_MAINFRAME;
 7   nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
 8   nid.uCallbackMessage=WM_SHOWTASK; //自定義的消息名稱
 9   nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
10   strcpy(nid.szTip,"程序名稱"); //信息提示條為“計劃任務提醒”
11   Shell_NotifyIcon(NIM_DELETE,&nid); //在托盤區刪除圖標
12 }

 

posted @ 2011-10-22 13:14 王海光 閱讀(1198) | 評論 (0)編輯 收藏
僅列出標題
共27頁: First 19 20 21 22 23 24 25 26 27 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区影音先锋| 亚洲精品欧美专区| 久热精品在线视频| 欧美在线观看视频一区二区三区| 国产伦精品免费视频| 欧美激情视频一区二区三区不卡| 久久深夜福利免费观看| 久久久夜精品| 欧美黄免费看| 亚洲人成网站777色婷婷| 亚洲国产婷婷香蕉久久久久久99| 中国亚洲黄色| 午夜精品久久久久久久99热浪潮| 午夜精品久久久久影视| 久久久久亚洲综合| 欧美激情亚洲视频| 在线视频亚洲| 久久漫画官网| 欧美日韩一区二区在线观看| 国产精品影片在线观看| 在线观看av不卡| 亚洲每日更新| 欧美在线欧美在线| 中文亚洲字幕| 在线亚洲欧美| 久久久久欧美精品| 亚洲成在线观看| 99re8这里有精品热视频免费 | 欧美一级片在线播放| 久久国产精品久久w女人spa| 欧美电影免费网站| 国产精品资源| 日韩午夜av电影| 久久精品国产久精国产思思| 亚洲国产精品激情在线观看| 午夜精品久久| 欧美三级中文字幕在线观看| 国产永久精品大片wwwapp| 99国产麻豆精品| 久久综合狠狠综合久久激情| 99精品视频网| 欧美韩日精品| 亚洲成人在线| 久久人人97超碰国产公开结果| 亚洲乱亚洲高清| 免费视频一区| 亚洲成色777777在线观看影院| 亚洲欧美区自拍先锋| 亚洲国产影院| 欧美成人午夜激情在线| 伊人夜夜躁av伊人久久| 久久精彩视频| 亚洲欧美在线高清| 国产精品毛片a∨一区二区三区| 亚洲精品一区二区在线| 欧美成人精品一区二区| 99热这里只有精品8| 在线观看91久久久久久| 欧美中文字幕视频在线观看| 亚洲精品欧美专区| 欧美chengren| 亚洲欧洲午夜| 亚洲黄色在线观看| 欧美国产日韩xxxxx| 亚洲精品欧美日韩专区| 亚洲国产精品尤物yw在线观看 | 欧美精品免费看| 亚洲精品一区二区三区樱花| 亚洲欧洲精品成人久久奇米网| 欧美激情2020午夜免费观看| 一本色道久久加勒比精品| 99精品视频一区| 国产精品社区| 久久久久国色av免费看影院| 久久精品视频99| 亚洲国产视频一区| 99热精品在线| 国产亚洲欧美日韩一区二区| 久久综合狠狠综合久久综青草| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲日韩中文字幕在线播放| 99精品久久| 国产一区在线播放| 亚洲高清网站| 国产精品视频免费观看www| 久久久久久色| 欧美极品在线观看| 小嫩嫩精品导航| 久久男人av资源网站| 日韩午夜激情| 午夜精品www| 亚洲国产精品嫩草影院| 亚洲国产成人av在线| 欧美日韩久久久久久| 国产日本欧美一区二区三区| 美女黄色成人网| 美女视频一区免费观看| 亚洲娇小video精品| 亚洲视频在线观看免费| 国产日韩欧美一区二区三区在线观看| 久久久久国产精品厨房| 久久综合狠狠综合久久综合88| 亚洲成色最大综合在线| 亚洲激情av在线| 欧美激情精品久久久久| 久久国产精品色婷婷| 久久视频在线视频| avtt综合网| 先锋影音国产一区| 亚洲激情中文1区| 麻豆久久精品| 国产欧美婷婷中文| 亚洲国产导航| 国产一区二区久久| 亚洲另类一区二区| 韩国久久久久| 欧美在线观看www| 久久xxxx| 亚洲私拍自拍| 在线 亚洲欧美在线综合一区| 亚洲大片在线| 国产精品成人在线| 亚洲精品之草原avav久久| 国产日韩精品一区二区三区在线| 欧美ed2k| 国产欧美日韩另类一区| 亚洲国产mv| 国模大胆一区二区三区| 亚洲综合不卡| 亚洲乱亚洲高清| 久久久久国产一区二区| 亚洲欧美在线磁力| 欧美日本三区| 欧美黑人在线播放| 在线日韩日本国产亚洲| 亚洲嫩草精品久久| 一区二区三区高清| 久久综合色一综合色88| 久久精品av麻豆的观看方式| 欧美三级在线| 亚洲无线视频| 亚洲午夜视频在线观看| 女女同性女同一区二区三区91| 午夜精品久久久久久99热软件| 欧美高清在线观看| 欧美黄色一级视频| 夜夜爽www精品| 欧美精品色网| 亚洲二区在线| 亚洲精品久久久久久一区二区| 久久久久99| 久久综合久久美利坚合众国| 国产手机视频精品| 欧美一站二站| 久久久综合网站| 精品1区2区| 亚洲免费av片| 久久9热精品视频| 国产日产欧美精品| 香港久久久电影| 久久精品国产免费观看| 国产亚洲精品aa| 欧美国产一区二区在线观看| 亚洲第一综合天堂另类专| 亚洲国产成人精品女人久久久| 久久久久久久久久码影片| 久久亚洲精品网站| 国产精品丝袜白浆摸在线| 欧美中文字幕精品| 免播放器亚洲| 日韩亚洲成人av在线| 欧美日韩视频免费播放| 亚洲一二三四区| 亚洲国产精品专区久久| av成人免费| 国产精品影院在线观看| 久久成人精品| 免费中文字幕日韩欧美| 99国产精品久久久久老师 | 免费试看一区| 亚洲综合丁香| 噜噜爱69成人精品| 亚洲日本中文字幕免费在线不卡| 欧美激情第三页| 亚洲色图制服丝袜| 欧美大片第1页| 欧美一区在线视频| 国产一区二区三区免费在线观看| 欧美在线观看视频在线| 欧美顶级少妇做爰| 亚洲午夜在线| 亚洲精品日产精品乱码不卡| 欧美午夜一区| 亚洲香蕉视频| 欧美14一18处毛片| 亚洲新中文字幕| 激情一区二区三区| 欧美日本国产一区| 欧美伊人久久大香线蕉综合69| 欧美一级精品大片|