『Windowsコアプログラミング』のメモ

2076 ワード

文字列
  • バッファオーバーフローの問題を回避するには、strcpy/wcscpy、strcat/wcscatなどの安全でない文字列およびメモリ操作関数の使用を回避する必要があります.
  • _countof()文字の出中文字数を取得し、使用を避ける(strlen/wcslen).
  • メモリ割り当てマクロ#define chmalloc(nCharacters) (TCHAR)malloc(ncharacters*sizeof(TCHAR)を定義する.
  • 一般的に、1つのバッファ処理関数のパラメータにターゲットバッファの長さが含まれていない場合、このような関数の使用を回避するとともに、このような関数の実装を回避する必要があります.C実行ライブラリは、memcpy_s memmove_s wmemcpy_s wmemmove_sなどの記号定義の中で、マクロ__STDC_WANT_SECURE_LIB__を定義することによって、バッファ処理に一連の代替関数を提供します.使用します.
  • コンパイラフラグ/GSおよび/RTCsを使用することにより、バッファオーバーフローを自動的に検出することができる.
  • .
  • は、MultiByteToWideCharWideCharToMultiByteによってUnicodeとANSIの間の変換を完了し、入力ターゲット文字列の長さが0であると、変換に必要なターゲットバッファ文字数を返すことができます.MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx.
  • ANSIとUnicodeバージョンの関数をエクスポートするには、通常、Unicodeバージョンの関数を1つ定義するだけで、ANSIバージョンの関数で文字列変換を実行してからUnicodeバージョンの関数を呼び出し、戻り値も同様に処理すればよいので、Windows内部でもこのような方式が採用されているため、Unicodeバージョンのプログラム効率はANSIバージョンに比べて高い.
  • API IsTextUnicodeは、文字がUnicode符号化であるか否かを判断するために使用することができるが、この方法は100%信頼できるものではない.
  • プロセス
  • GetCommandLineは、プロセスの完全なコマンドラインパラメータを取得するために使用されるが、コマンドラインバッファを変更しようとすることは推奨されない.
  • GetEnvironmentString()関数は、プロセスアドレス空間内に割り当てられたメモリであるプロセスの環境ブロックを取得し、その文字列は以下と類似する:
  • .
     =::=::\ ...
    VarName1=VarValue1\0
    VarName2=VarValue2\0
    VarName3=VarValue3\0
    VarNameX=VarValueX\0
    
  • GetEnvironmentVariable(PCTSTR pszName,PTSTR pszValue,DWORD cchValue)関数は、指定された環境変数の値を取得し、同様に、パラメータcchValue0に入力されると、必要な文字数を返します.
    DWORD WINAPI GetEnvironmentVariable(
      _In_opt_  LPCTSTR lpName,
      _Out_opt_ LPTSTR  lpBuffer,
      _In_      DWORD   nSize
    );
    
  • 関数ExpandEnvironmentStringsは、環境変数文字列を展開するために使用され、その宣言:
  • DWORD WINAPI ExpandEnvironmentStrings(
      _In_      LPCTSTR lpSrc,
      _Out_opt_ LPTSTR  lpDst,
      _In_      DWORD   nSize
    );
    

    MFC