- WhereNow_v1.0.zip
- ReadMe
- 住所データ
(初回のみダウンロードしてください) - ソース
コメントでご指摘頂いて初めて気がついたのですが、メニューから一度ログのクリアを実行するまでログが作られていいませんでした。
原因は CreateFile()にOPEN_ALWAYSを渡すべきところを OPEN_EXISTINGにしていたために、新規にファイルを作成することができないという情けないものでした。
ログのクリアはファイルの作成を兼ねているので、一度でもクリアを実行すると無事にログを作成できていたんですね。失礼いたしました。
つまらないバグついでにコードを見直しているとこんなのも見つけました。
static VOID ExecGoogleMap()
{
PROCESS_INFORMATION pi = {0};
TCHAR szParam[256] = _T("");
if (0 < g_dblLatitude && 0 < g_dblLongitude) {
// パラメータ作成
}
if (CreateProcess(g_szGoogleMapPath, szParam, NULL, NULL, NULL, 0, NULL, NULL, NULL, &pi)) {
CloseHandle(pi.hProcess);
}
}
モバイルGoogleマップを起動している部分ですが、適当にサンプルを写したので 意味もなくPROCESS_INFORMATIONを使っています。勘違いでした(笑
pi.hProcessをCloseHandle()しているのが悪いのではなく、pi.hThreadをCloseHandle()していない事が悪かったみたいです。
static VOID ExecGoogleMap()
{
PROCESS_INFORMATION pi = {0};
TCHAR szParam[256] = _T("");
if (0 < g_dblLatitude && 0 < g_dblLongitude) {
// パラメータ作成
}
if (CreateProcess(g_szGoogleMapPath, szParam, NULL, NULL, NULL, 0, NULL, NULL, NULL, &pi)) {
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
}
また、GPSの監視部分でもサンプルを写したときの間違いがありました。
お手本にした「Windows Mobileプログラミング徹底理解」では3種類のイベントを監視していたのですが、WhereNowでは2種類を監視すればよかったので 次のようにしています。
static HANDLE g_hGpsEvent[2] = {0};
// GPS計測開始
VOID GpsStart(HWND hWnd)
{
g_hGpsEvent[EVENT_STOP] = CreateEvent(NULL, FALSE, FALSE, NULL);
g_hGpsEvent[EVENT_NEWLOCATION] = CreateEvent(NULL, FALSE, FALSE, NULL);
ところが、肝心のイベント監視の部分ではそのまま WaitForMultipleObjects(3, ...)としていました。今度は典型的なバッファオーバーランですね。WaitForMultipleObjects(2,...)と修正しておきました。
探せば他にもボロが出てきそうですが、今日はこの辺で...。


















