アプリ版:「スタンプのみでお礼する」機能のリリースについて

C++ test.exe起動時に test.iniを作成するソースコードがはいっているのですが
作成できません。 どうすればいいのですか?

※ test.cppには コモンダイアログ「新規作成,名前を付けて保存,上書き保存,・・」 ・ini書き込むためのソース がはいっています。しかし 
test.iniを書き込む ソースコードを書いて コンパイルリンクしたのですが test.exeを実行すると
test.iniが作成されないので なにかおかしいと思いましたが なにが原因ですか?

アップロード:http://www.dotup.org/uploda/www.dotup.org5122680 …
(zip 圧縮 アップロード 「パスワード:1012」)

A 回答 (5件)

>test.cpp 内には


>コモンダイアログ 「新規作成,名前を付けて保存,上書き保存」 とエディットコントロールがあるのですが
>それが表示されません。 どうすればいいのですか?

-Wオプション付きでコンパイルすればいいです。

とりあえず……
・コンソールアプリケーション
 main()から始まる。
・Windowsアプリケーション
 WinMain()から始まる。
の2種類がある。ということをお勉強した上でコード書いてください。
# ダイナミックリンクライブラリ(DllMain()から始まる)ってのもありますが、まぁ当面は関係ないでしょう。

>※test.ini の読み取りは メニューバーにある「version更新」を押すと test.iniをコマンドプロンプトのウィンドウ で開けばいいと考えているのですが これはできますか?

コマンドプロンプト開く必要すらありません。
「version更新」のイベントハンドラ内にmain()に書いた内容を記述すればいいでしょう。

>※ファイルを展開すれば ファイル内容及び ソースコードが分かるのですが
> 確認せずに!? 投稿ということは 大抵ファイルを展開していない 自分の予想として・・・とか
> で投稿をしているのではないかぁと思います。

展開して、中を見た上で呆れて回答しただけですがなにか?
現状での最新ソースがどうなっているかも不明ですし、今はアップローダから削除されてしまったようですが。
# さしたる重要度も無いのでRAMデイスクにDL&展開したので、私の手元には残っていませんけどね。
# ついでに、後からこの質問見た人にはどんなコードだったのかさっぱりなんで似たような問題に直面した人には役に立たない質問になってますが。

で…カレントディレクトリについて指摘しましたが理解されていないようなので現状で起こりうる問題も指摘しておきますかね。
# やり方次第で発生しないけど最新ソース確認できないし。

1)メニューバーにある「version更新」押下。
=>iniファイルが無いので新規作成。
2)コモンダイアログ「新規作成,名前を付けて保存,上書き保存,・・」で別フォルダーに移動してファイル名指定して[OK]押下。
=>こっそりカレントディレクトリ変更されました
3)再度、メニューバーにある「version更新」押下。
=>iniファイルが無いので新規作成。


最新ソースは不明ですし、私の回答はお気に召さなかったようなので以後は控えますね。

この回答への補足

bcc32 -W -w- test.cpp →ウィンドウが表示される

bcc32 test.cpp (オプションなし) →test.iniの読み込みを コマンドプロンプトのウィンドウで表示されるだけで ウィンドウは表示されません


test.cpp にはモジュールなどがあるのですが -W -w- のオプションがなしだと test.iniをコマンドプロンプトで表示されるだけなので どうにかしてやりたいのですが
どうすればいいのですか?

・-W オプションでコンパイルリンクすればいいです。!?
 これは-W windowsアプリケーションを指定しています。
 -W -w- だと -w- は関数などで使うときに必要と・・ いうことは

test.cpp には関数. windowsアプリケーションを指定している


test.cpp 一部ソース
メイン ウィンドウを作成するソース

//
// 関数: InitInstance(HINSTANCE, int)
//
// 目的: メイン ウィンドウを作成します。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // グローバル変数にインスタンス処理を格納します。

hWnd = CreateWindow(TEXT("Mymeako"), TEXT("Mymeako"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}
int ini(); //.ini読み込み
int createini(); //.ini作成

int main()
{
FILE *fp;

if ( (fp = fopen("test.ini","r")) != NULL ){ //ファイル存在確認
//存在する
fclose(fp);
ini();
}else{
//存在しない
fclose(fp);
createini();
}
return 0;
}

int ini()
{
BOOL bRet;
TCHAR fPath[MAX_PATH];

ZeroMemory(fPath,sizeof(fPath)); //バッファ初期化

bRet = GetCurrentDirectory(MAX_PATH,fPath);
if(bRet == 0){ //GetCurrentDirectory失敗
LPVOID lpMsgBuf;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf, 0, NULL);
printf("%s",lpMsgBuf);
ExitProcess(-1);
return -1;
}
lstrcat(fPath,_T("\\test.ini"));

TCHAR buf[1024];
//[TEST]のTESTMSGの文字列をbufに格納
GetPrivateProfileString(_T("TEST"),_T("TESTMSG"), _T("NoSection or Key"),buf,sizeof(buf),fPath);

printf(buf);

return 0;
}

int createini()
{
HANDLE hFile;
//test.ini作成
hFile = CreateFile(_T("test.ini"),GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE) //CreateFile失敗
{
LPVOID lpMsgBuf;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf, 0, NULL);
printf("%s",lpMsgBuf);
CloseHandle(hFile);
ExitProcess(-1);
return -1;
}

//test.iniに初期情報?書き込み
TCHAR buf[] = _T("[TEST]\r\nTESTMSG=The version of a system = 1.8.3 System Operating check = ok System Operation Time =2013/06/01");
DWORD dwSize;
BOOL bRet;

bRet = WriteFile(hFile,buf,sizeof(buf),&dwSize,NULL);
if(!bRet){ //WriteFile失敗
LPVOID lpMsgBuf;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf, 0, NULL);
printf("%s",lpMsgBuf);
CloseHandle(hFile);
ExitProcess(-1);
return -1;
}
CloseHandle(hFile);
ini();
return 0;
}

としています。
メイン ウィンドウのメッセージ 処理は
コモンダイアログ 「新規作成,名前を付けて保存,上書き保存」 ・エディットコントロール
・バージョン情報 メッセージハンドラです。

※これでソースコード一部は分かりますが
test.cpp test.rc resource.h などをzipにして圧縮していますので
ソースコードを見ながら 修正などをしてください。

ソースコード・アップロード:http://www.dotup.org/uploda/www.dotup.org5124990 …

コモンダイアログ:http://gurigumi.s349.xrea.com/programming/visual …

メッセージダイアログ:http://gurigumi.s349.xrea.com/programming/visual …

参照サイト:http://gurigumi.s349.xrea.com/programming/visual …

c ini 書き込み:http://www.little-diary.net/archives/78/
([C++] .iniファイル 読み込み [WinAPI]・.iniファイル作成から読み込んで出力まで)



※ファイルを展開すれば ファイル内容及び ソースコードが分かるのですが
確認せずに!? 投稿ということは 大抵ファイルを展開していない 自分の予想として・・・とか
で投稿をしているのではないかぁと思います。

補足日時:2014/06/14 13:23
    • good
    • 0

>★★★簡単にいうと ウィンドウが開いて正常にメニューバーが表示されるのですが


>ウィンドウが現れず コマンドからtest.iniを読み込んでやっています。

コマンドプロンプトのウィンドウは開いたんじゃないですか?

>この場合 どうすればいいのですか?★★★

やりたいようにプログラミングしてください。
最初の質問の「test.iniを作成するソースコードがはいっているのですが作成できません。」については解決したかと思われます。

それ以外にウィンドウ開いて何をしたいのか、iniファイルの保存と読み込みをどのタイミングでやりたいのか…。
どれも不明です。
カレントディレクトリ変更されたらiniファイルが行方不明になるようですし……。

どこまでサポートされるかは不明ですが、iniファイル扱うなら
GetPrivateProfileString()
http://msdn.microsoft.com/ja-jp/library/cc429779 …
GetPrivateProfileInt()
http://msdn.microsoft.com/ja-jp/library/cc429763 …
WritePrivateProfileString()
http://msdn.microsoft.com/ja-jp/library/cc429952 …
辺りを使った方がいいと思いますよ。

この回答への補足

コマンドプロンプトのウィンドウは開いていますが これでもtest.iniを読み込むだけとなっていますが

test.cpp 内には
コモンダイアログ 「新規作成,名前を付けて保存,上書き保存」 とエディットコントロールがあるのですが
それが表示されません。 どうすればいいのですか?

★タイミング★
test.exe を起動すると 「test.iniが存在する場合」 →コマンドプロンプトのウィンドウで読み取りをするのではなくて test.exeにはコモンダイアログなどがあるのでそのウィンドウが表示されたらOKです。
※test.ini の読み取りは メニューバーにある「version更新」を押すと test.iniをコマンドプロンプトのウィンドウ で開けばいいと考えているのですが これはできますか?

すでに test.cppにはtest.iniをなかったら→作る あったら→version更新を押したらコマンドプロンプトのウィンドウで開く とするようにしたいです。

・bcc32 -W -w- test.cpp の場合 ・メニューバー及びウィンドウが表示される
・bcc32 test.cpp の場合 ・ウィンドウ及びメニューバーは表示されず test.iniを読み込むだけのプログラムになっている。

プログラム内容
・test.cpp →コモンダイアログ「新規作成,名前を付けて保存,上書き保存」 ・アプリの終了 ・test.iniを読み込むソースコード

・resource.h →メニューID , test.iniを作成するためのID...

・compile.bat → test.cpp test.rc コンパイル.バッチファイル..

・amsctl.ico → アイコン

・test.exe → アプリケーション

・test.map →ID定義 ソースコード関連..

・test.rc →メニューバー定義

・test.objなど →コンパイル時に作成されたプログラム


※ファイルを展開すれば ファイル内容及び ソースコードが分かるのですが
 確認せずに!? 投稿ということは 大抵ファイルを展開していない 自分の予想として・・・とか
 で投稿をしているのではないかぁと思います。

※ファイルを展開して ファイル内容が分からないのにどうやって 確認するのですか?
 この…がよく分かりません。
・ただ単に 質問内容から理解する人がいますが 参考サイトやアップロードがされているというところ
URL などに注目したらどうですか?

補足日時:2014/06/13 16:45
    • good
    • 0

>test.iniを書き込む ソースコードを書いて コンパイルリンクしたのですが test.exeを実行すると


>test.iniが作成されないので なにかおかしいと思いましたが なにが原因ですか?

コールされない関数を作ったこと…でしょうかね。

>bcc32 -W -w- test.cpp コンパイル成功
>brc32 test.rc コンパイルリンク成功

では
int main()
int ini()
int createini()
はコールされません。

スタートアップルーチンからコールされるのは
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
の方ですし。
# -WでWindowsアプリケーション指定しているんですから。

http://docs.embarcadero.com/products/rad_studio/ …

この回答への補足

bcc32 test.cpp
brc32 test.rc

でコンパイルリンクすると うまくできましたが test.exeを起動するとhellosと構成ファイルtest.iniに書き込まれている文字が読み込まれて コマンドが開き表示されたのですがこれだと

test.iniのデーターを読み込んでコマンドで読み込むしかやっていない ということは

★★★簡単にいうと ウィンドウが開いて正常にメニューバーが表示されるのですが
ウィンドウが現れず コマンドからtest.iniを読み込んでやっています。
この場合 どうすればいいのですか?★★★

補足日時:2014/06/12 23:16
    • good
    • 0

ソースはまともに見ていません


test.exe はどういったフォルダにおかれて実行しているのでしょうか?
また 使っているOSは何なのでしょうか?

Vista以降なら可能性として
・UAC要因によって VirtualStore に書き込みされている
・同じくUACと起動方法(特にスタートアップ登録した場合)の問題で
 プログラム自体が動いていない などが考えられます

VirtualStore について
http://homepage2.nifty.com/nonnon/Chinamini/2010 …

この回答への補足

じゃあ ソースコードなどをみなくても分かりますか?
どこの ソースコードが間違っているとか パスが共通していないとか
ちゃんと確認すればするほど ソースコードが間違えているところも分かるのですが


◇c ini参照サイト:http://www.little-diary.net/archives/78/
[C++] .iniファイル 読み込み [WinAPI] ・.iniファイル作成から読み込んで出力まで参照

◇ただ 単にコモンダイアログがある場所に .iniファイル作成から読み込んで出力までのソースコードをコピーして 貼り付けでコンパイルリンクしましたが何も問題 エラーはありません。

★ソースコードを見直したのですが エラー箇所などありませんでした。 しかし

★詳しく見たりすると なにか分かるのではないかなぁーと思います

★test.exe を実行する為には まずbcc32 -W -w- test.cppでコンパイルし brc32 test.rcでコンパイルリンクします そうすると test.exeは できますが
test.cppのプログラムには test.exeを実行後にtest.iniを作成するようになっていまのですがどうすればいいのですか?★

※OSのバージョンとかではないかと思います。
 ただたんに コピーをしただけでは なにかかたりないと思うときがありますが 今回は二台のパソコンで コンパイルを確認しましたが どちらとも OKでした。

★★★やはり これはソースコードに問題があります。
※アップロードサイトからzipに圧縮されているファイルを展開して ソースコードを確認してください。
 そのソースコードが間違っている 可能性がございます。.... ★★★


bcc32 -W -w- test.cpp コンパイル成功
brc32 test.rc コンパイルリンク成功

★回答よろしくお願いします...★

補足日時:2014/06/12 22:19
    • good
    • 0

もしかしたら、存在確認、読み込み、書き込みのそれぞれでパスを共通でしていしていないからではないでしょうか

この回答への補足

★★★上にある アップロードされているzipをパスワード:1012 でダウンロードしてください。
アップロードされているファイルには ソースファイル「test.cpp test.rc~~」 などありますので それを確認した上で再度 アップロードしてもらってくれませんか? 自分はなかなかC++ 関係はよくわからないので もしよければ お願いします。★★★

>存在確認、読み込み、書き込みのそれぞれでパスを共通でしていしていないからではないでしょうか
ということは どういうことですか?

単に,それぞれのパスを共通させるということですか?
だとすると パスを共通するために ソースコードを変更しないといけなくなったりするので 
パスを編集することは自分でいまいち理解していないので 

もしよければ 編集した上でアップロードしてもらうませんか?

補足日時:2014/06/12 20:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!