MFC カレントディレクトリの取得
カレントディレクトリを取得して初期設定ファイルを置こうとした時に少し詰まったのでメモ。
"GetModuleFileName"を使ってみるが実行ファイル名まで取得できてしまう。そこからパスを分割して実行ファイル名を消して~でディレクトリ取得することも考えたけどもう少し簡単な方法がないかとパス。
"GetCurrentDirectory"だとなぜか想定していたディレクトリが取れなくて断念。
色々試した結果、"GetModuleFileName"で実行ファイル名までのパスを取得して"PathRemoveFileSpce"を使ってファイル名を切れることが分かったので実装。
TCHAR dirpath[256]; // 第1引数をNULLにすることで実行ファイルの完全パスをdirpathへ格納 // ex.D:\workspace\test.exe if(GetModuleFileName(NULL, dirpath, 256)) { // 取得したパスからファイル名を削除 ex.D:\workspace PathRemoveFileSpec(dirpath); }
dirpathへカレントディレクトリを獲得することができた。
MFC 文字列がIPアドレスフォーマットかどうか判断する
最近C++を使う事が増えてきたのでメモ。
MFCにて文字列がIPアドレスフォーマットかどうかについてチェックする方法について備忘録残していきます。(Visual Studio2019使用)
調べるとどうやら"inet_addr"を使えばいいらしいので使おうとするも以下のエラー。
エラー C4996 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings
inet_addrは推奨できないのでinet_ption()かInetPton()使ってねとのこと。
と言うわけでInetPton()を使用する。
InetPtonW function (ws2tcpip.h) - Win32 apps | Microsoft Docs
・第1引数 : AF_INET指定でIPv4、AF_INET6指定でIPv6対応
・第2引数 : フォーマットチェックを行う文字列のポインタ
・第3引数 : 変換したIPアドレスを格納するポインタ(今回は使用せず)
・返り値 : 第2引数のフォーマットがIPアドレスでなければ0を返す
#include <ws2tcpip.h> char ipaddr[16]; CString ipstr = _T("127.0.0.1"); int ret; // ipstrがIPアドレスフォーマットかどうかチェック ret = InetPton(AF_INET, ipstr , ipaddr); if (ret == 0) { //戻り値が0の場合はIPアドレスフォーマットでないのでfalse return(false); } return(true);
第2引数に取得した文字列を入れることによりIPアドレスフォーマットかどうかチェックすることが出来る。