[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 03/18 18:44 / Filesize : 201 KB / Number-of Response : 779
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

★初心者にVisual C++を教えるスレ★ Part25



1 名前:デフォルトの名無しさん [2007/01/10(水) 00:00:39 ]
1 : ◆Manna2uCLg :2005/04/15(金) 13:33:14
Visual C++入門者・初心者からの質問を、
お兄ちゃん達が優しく、時には厳しく回答してくれるスレッドです。

■質問するにあたって
・エラーや警告のときはエラーメッセージを書きましょう。
・開発環境も書きましょう。
・できるだけ具体的に。

質問の仕方については次のページが大変参考になります。
www.hyuki.com/writing/techask.html
myu.daa.jp/osiete/

■回答するにあたって
・回答する場合はその答えに至るための「コツ」も書いてあげると良いでしょう。
 (MSDNのどの項目だとか、何のキーワードでGoogleするとか)
・ネタや煽りは軽く流しましょう。

過去スレ、関連スレなどは>>2-5


29 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 18:46:27 ]
メッセージポンプはRun()の中。
InitInstance()で処理し続けちゃダメ。
初期化だけしてすぐ終われ。

30 名前: [2007/01/10(水) 18:51:13 ]
>>29
そうするとRunをオーバーライドしてそこに処理を書くということでしょうか?
うーんでもRunの中はメッセージを待つのでまずいような
でもそうなると処理中は割り込めないような・・・
どうすればいいのでしょうか?

31 名前:デフォルトの名無しさん [2007/01/10(水) 18:59:25 ]
VisualC++6.0の入門書を読み始めました。
時代の流れに乗り遅れないためにと、始めたのですが、
VisualC++はどういうアプリケーションで使われているのでしょうか?

32 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 20:00:33 ]
入門書から既に時代遅れな件について

33 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 20:00:37 ]
>>30
UIを扱うスレッドで長い時間がかかる処理をする、ということ自体がダメ。
だから「UIだけを扱うスレッドを走らせよう」って発想が出て「UIスレッド」って呼ばれるのよ。

処理に割り込みなんて、自分で書かないとできない。
(TerminateProcessやTerminateThreadはDLL絡みとかで問題がある)
長い時間がかかる処理を中断させたいなら、その処理内で中断フラグをちょくちょく見るしかない。

34 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 01:33:23 ]
先スレの992ですが
外人さんの作った、VC6のプログラムを、VC8に移植しているのですが日本語表示が上手く出来ません、
>>996の手ほどきで
1.プロジェクトのプロパティでリソースのカルチャを日本語にする
2.リソースビューでIDD_ABOUTBOXをシングルクリックしプロパティのLanguageを日本語
3.リソースビューでIDD_ABOUTBOXをダブルクリックしFontを日本語Fontに変更
間でしたのですが
4.ダイアログに適当に日本語を設定しビルドと、
>>あとPG内で_tsetlocaleはしておいたほうが無難。
とアドバイスしてくれてたのですが
_tsetlocaleで検索すると
_tsetlocale(LC_ALL,_T(""));に設定しなさいとか出てきたのですが、これってMFCの場合ですよね?

35 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 01:41:56 ]
補足します、現在の文字コードはマルチバイトに設定しています、
コンパイラの設定を上記の変更をしたおかげで、リストビューのタイトルメニュー等は
日本語表示が出来るようになったのですが
日本語データを読込んで表示する部分で変換が出来ていません(文字化けします)
なるべく手間を掛けずに日本語表示できる方法があれば教えてください。


36 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 01:47:21 ]
>>34
いいえ、_tsetlocaleはMFCのものではありません。Cランタイムの関数です。

37 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 01:54:27 ]
>>36
そうですか、_tsetlocaleを使う場合何か特別なヘッダーファイルを
インストールしないとだめなのでしょうか?
_tsetlocale(LC_ALL,_T(""));こう記述すると
error C2065: 'LC_ALL' : 定義されていない識別子です。
error C3861: '_T': 識別子が見つかりませんでした
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
となるのですが?




38 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 02:07:14 ]
>>37
#include <locale.h>です。MSDNぐらいは見ましょう。

>日本語データを読込んで表示する部分で変換が出来ていません
読み込んだデータじゃなく固定で "てきとう" を表示しようとしたら表示できます?

39 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 02:07:14 ]
>>37
msdn 読んでくれ。

40 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 02:14:12 ]
すみません、良く調べますそれから報告ですが
現在64個のエラーが出ているのですが、エラーのリストを秀丸に貼り付けて正規表現の置換を使って分析したら。
: error C2664: 'lstrcpyW' : 1 番目の引数を 'char [100]' から 'LPWSTR' に変換できません。
             : 1 番目の引数を 'char [100]' から 'LPCWSTR' に変換できません。
: error C2440: '=' : 'const char [1]' から 'LPWSTR' に変換できません。
の2種類だけですが解決の糸がかりになりませんでしょうか?


41 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 02:16:06 ]
>>40
35で言ってる >補足します、現在の文字コードはマルチバイトに設定しています
があやしい。'lstrcpyW'はUNICODE用。

42 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 02:24:22 ]
なんども、すみません
35の時点ではマルチバイトでしたが日本語変換できないので
_tsetlocale(LC_ALL,_T(""));を使うにために現在はUNICODEに設定しています


43 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 04:22:03 ]
> _tsetlocale(LC_ALL,_T(""));を使うにために現在はUNICODEに設定しています 
悪いけど、お前さんに今の作業を完了させる事は難しい気がする。

LPCWSTR とか _T() とか、調べるべきキーワード沢山あるじゃん。

44 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 07:31:01 ]
_tsetlocale使うのにUNICODEを設定する必要は無いと思うが。

45 名前: [2007/01/11(木) 10:06:05 ]
>>33
マルチスレッドで長く複雑な処理は難しいということですか

フラグをちょくちょく見るにはソースのなかにちょくちょく
チェックするためのif文等をいれていくしかないのでしょうか?

そうするぐらいならタイマ割り込みのようなもので
スレッド側で定期的に監視させたいのですが
UIスレッドの処理中に子スレッド側で
タイマ割り込みのようなことはできるのでしょうか?

46 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 10:19:16 ]
>>45
ワーカースレッドにしとけ

47 名前: [2007/01/11(木) 10:26:21 ]
ワーカースレッドだと複雑な処理は難しいでしょう
JAVAなら割り込みメソッドがちゃんと用意されてるみたいです
www.javaworld.jp/technology_and_programming/-/10795-5.html



48 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 10:34:04 ]
InitInstance内で済まそうとしてるってことは単純な処理としか思えんが・・・

49 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 10:37:28 ]
>>47 の内容みたけど、その程度ならEvent使えば同じことできるじゃん

50 名前: [2007/01/11(木) 10:38:56 ]
今のところUIスレッドから派生したクラスの中で作った
メンバ関数をInitInstance内の中で呼び出すしかないと思ってやってるんですが
初心者なので他になにか良い方法があれば教えてください

51 名前: [2007/01/11(木) 10:43:23 ]
Eventは使ったことがないのですが調べてみます
参考ページがあれば教えてもらえたらうれしいです

52 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 10:49:13 ]
つまり、ユーザーインターフェースは入力も出力も必要ない
割り込みは必要ってことでいいのかな

53 名前: [2007/01/11(木) 10:53:17 ]
はい

子スレッドの状態を見るのはメイン側にメッセージを飛ばして解決しています

54 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 11:16:02 ]
単純な処理を複雑にやりたいということか

55 名前: [2007/01/11(木) 11:19:17 ]
クラスで実装しないと厳しいので単純でもないです

56 名前: [2007/01/11(木) 11:23:34 ]
初期化はコンストラクタ内でやっています
InitInstanceかRunいがいに処理を置ける場所がないように見えます
処理はし続けているので単純と言われれば単純ですね

メッセージを待って処理をするタイプではないです

57 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 11:38:24 ]
Javaの例も割り込みは自分でチェックするか例外が発生するしかないようだし
イベントの発生をチェックしては。
Sleepが絡むときはSleepのスレッド作ってそこからイベント、かなあ
最近のMFC知らんけどもっといい方法あるのかな



58 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 11:51:18 ]
.NETのSystem.Threading.Threadを派生する感じで実装するといい。
これでスレッドとクラスが一対一になって扱いやすくなる、といいな。

MFC使ってるみたいだから、
メンバにCWinThreadのポインタと中断用のCEventを用意して、
StartでAfxBeginThreadでタスクメンバ関数を起動、
ただし、CREATE_SUSPENDEDで起動 - CWinThread.m_bAutoDelete=FALSE
- CWinThread.ResumeThread() の手順を踏んでおく。
タスクメンバ関数は中断用CEventを適時監視しつつ処理を実行する。
AbortではCEvent.SetEvent()。
JoinはWaitForSingleObjectをINFINITEで、
IsAliveはWaitForSingleObjectをウェイト0で呼び出す。
ちなみに、CWinThreadポインタの破棄は、
もう一度スレッドを起動しなおす時か、デストラクタの時だけにした方が色々楽。

中断するときは、Abort->Join呼び出しでスレッド停止待ち。
自然に完了を待つには、SetTimerのハンドラでIsAlive見て確認、ってのが一番楽。

59 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 12:20:44 ]
何この馬鹿?
教えるだけ無駄だろ

> 25 名前:7[] 投稿日:2007/01/10(水) 18:12:42
> スレッドメッセージループはRunの中なのですか?
> 子スレッドはInitInstance()内で処理をし続けているので
> メッセージループがRunにあるとすれば回っていないと思います
>
> 26 名前:7[] 投稿日:2007/01/10(水) 18:23:30
> InitInstanceの処理中に他の処理を割り込ませることは無理なのですか?

60 名前: [2007/01/11(木) 12:22:41 ]
MFCで.NETのクラスを派生ですか
どうやればできるのかわかりません
クラスの追加ウィザードからできるのでしょうか?
環境はVC++7.0です

61 名前: [2007/01/11(木) 12:24:50 ]
>>59
すいません初心者なもので
あとそれは引用だけでまったく答えになっていませんよね

62 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 12:30:13 ]
馬鹿を晒しものにしてやってるだけだから気にしなくていいよ

63 名前: [2007/01/11(木) 12:32:43 ]
>>61
そうですか初心者を教えるスレで初心者相手に
馬鹿にして猿山大将気取りのなにが楽しいのか
わかりませんが気にしないことにします

64 名前: [2007/01/11(木) 12:33:33 ]
>>62さんでした^^;

65 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 12:40:12 ]
初心者ならともかく馬鹿に教えることは不可能

66 名前: [2007/01/11(木) 12:52:20 ]
>>65
>>25>>26の時点では
InitInstanceの処理中に割り込みをするにはメッセージを使うのかもしれないと
思っていたのでRun関数は通っていないのでメッセージ待ちは他の場所がるのかと
勘違いしていました

この時点での初心者と馬鹿の違いを教えてもらいたいところですが
それはまたスレ違いだと思いますので
馬鹿ですいませんがVC++を教えてもらえないでしょうか?^^;

67 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 12:56:56 ]
割り込みって書いてる時点で、Windowsアプリの知識が根本的に足りないと感じた。



68 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 12:57:11 ]
便乗質問ですが
ワーカースレッドでは実現困難で、UIスレッドを使うべきケースが思い浮かびません。
いくつかサンプルを拾って見てみたのですが、サンプルを書くために必然性なしにUIスレッドに
しているとしか思えないようなモノばかりでした。

CWinApp以外ではどういう時に使ってます?

69 名前:デフォルトの名無しさん [2007/01/11(木) 12:57:52 ]
一つ聞かせて頂きたいんですけど、C++はCの上位互換ですけど
C++が出来てCが出来ない人って居るんでしょうか?

70 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 13:02:29 ]
そうでもない

71 名前: [2007/01/11(木) 13:02:53 ]
>>67
子スレッドの処理中にメイン側の合図で他の処理をすることが目的なので
割り込みと表現したのですが^^;

72 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 13:04:48 ]
>>69
STLとboostが使えないと何も出来ない、という人はいるかも。

73 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 13:08:34 ]
>>71
Windowsではそういうことはできない。
メッセージでも、明示的/暗黙的にメッセージを処理できる状態にしてやらないと処理できない。

74 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 13:13:38 ]
スレッドと言いながら関数に割り込みかけてる。

75 名前: [2007/01/11(木) 13:19:41 ]
>>73
できないとなるとフラグメンバ変数かシグナル状態を変えて
ソース内で定期的にif文を記述しでチェックするしかないのでしょうか
そうなると>>58さんの方法がまだ理解できてないんですが
同じような方法ということでしょうか?

76 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 13:22:22 ]
関数の中のループに割り込みかけたいらしい。

77 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 13:24:58 ]
winnyはC++で書かれていますが、winMXもC++で書かれているのですか?



78 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 13:37:41 ]
>>75
フラグ変数がCEventオブジェクトになっただけ

79 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 13:45:15 ]
>>75
普通、重たい処理はループしてるから遅いわけで、ループ一回りに掛かる時間は
ごくわずか。そのループ中に1行eventの状態チェック入れるだけ。
ループしてないのに重いとか、ループ一回りが遅いというなら75の言うとおりになるかも。

80 名前:77 mailto:age [2007/01/11(木) 16:10:41 ]
誰か知りませんでしょうか?

81 名前:デフォルトの名無しさん [2007/01/11(木) 16:34:28 ]
VisualStudio2003を使用してMFCでモードレスダイアログを実装しようとしています。

support.microsoft.com/kb/403848/ja

こちらのページを見て、そのとおりに記述しているのですが、コンストラクタ内の
Create文を通ってもダイアログが表示されません。OSはWinXPです。
問題がわかる方、またはその他の良い方法を知っている方がいましたらよろしくお願いします。



82 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 16:37:50 ]
>>81
ダイアログのID はIDDですか?

83 名前:82 mailto:sage [2007/01/11(木) 16:49:15 ]
>>81
ごめん、ちょっとやってみた。
ダイアログのプロパティでVisible をtrueにするか
new したあとで ShowWindow(SW_NORMAL) 呼んでみな

84 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 18:47:13 ]
MFC使うなら2005Expressじゃダメですか?VC8.0あたり買ってこないとダメ?

後これといった質問はないのですが、
此処での初心者ってのはどこまでが初心者なんですか?

85 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 19:24:55 ]
>>81
特に問題なくダイアログ表示できた

86 名前:81 mailto:sage [2007/01/11(木) 19:29:46 ]
>>82
IDDでした

また、Visibleにしたところ、ちゃんと表示されるようになりました。
(今までのは作成だけされて見えていなかったということでしょうか?
タスクを見ているとメモリ使用量だけはCreateした分だけ増えていたので・・・)
ありがとうございました!

87 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 21:30:29 ]
まあそうみたいだな。
モードレスダイアログは作りっぱなしでSHOW、HIDEするケースが多いから
ShowWindow()も試しておいたほうがいいと思うよ。



88 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 22:06:09 ]
プログラム関連ではないのですが、質問です。
resource.hのファイル名を変更してTestResource.hとしました。
以降このファイルにリソースのdefine値を連動させておくため、
リソースファイルのincludeをresource.hからTestResource.hに変更した
まではよかったのですが、リソース変更後に保存するとなぜかinclude
先がresource.hに戻ってしまいます。これはどうしてなんでしょうか?
解決法を知っている方いましたらお教えください。お願いします。

89 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 22:10:17 ]
変えるとなんかいいことあるの?

90 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 22:13:38 ]
>>88
リソースビューで、xx.rcを右クリックしてインクルードファイルの設定替えればいい
つーか、ヘルプに書いてあると思うが

91 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 22:25:06 ]
>>84
Express Edition には MFC はついてこないので
パッケージ版を購入してくるべし。

92 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 22:34:15 ]
>90
できました、ありがとうございます。

93 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 22:36:49 ]
>>91本当ですか。。。。所持金ヤバイのにorz2万とかムリス
アカデミはなんか無理そうだし・・・

94 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 22:55:38 ]
>7にはこのコードをあげる。よい子は使っちゃダメだぞ。
typedef void (*throwFuncType)();
void dothrow_func(){ throw 300;}
DWORD CALLBACK threadproc( void * ){
printf("BeginThread\n");
int i=0;
try{
while(1) { i++; }
}catch( int ){
printf("\n%d: catched exception.\n",i);
}
return 0;
}
int main(){
throwFuncType dothrow_ptr = dothrow_func;
DWORD id; HANDLE hThread = CreateThread(NULL,0,threadproc,NULL,0,&id);

char t[255]; fgets(t,200,stdin);

CONTEXT context; context.ContextFlags = CONTEXT_CONTROL;
SuspendThread( hThread); GetThreadContext(hThread, &context);
context.Eip = (DWORD)dothrow_ptr;
SetThreadContext(hThread, &context); ResumeThread( hThread);
WaitForSingleObject(hThread,INFINITE);
}

95 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 23:10:33 ]
>>93
アカデミックはスタンダード相当でMFCもきちんとあるはずだぞ。

96 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 23:28:20 ]
>>94
こんな手があったのか。面白いけどちょっと怖いな。

97 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 23:34:16 ]
>>95
学生じゃ無くて無理そうなのでは



98 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 13:33:06 ]
MFCのデータベースプログラミングをしようとして
ODBCを使ってみたんですがテーブルごとにクラスが作られてしまいますが
いろいろなテーブルを取得したい場合はどうすればいいのでしょうか?

99 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 15:25:55 ]
>>98
自分で直接CDatabaseやらCRecordsetやらをいじくればいいが、
今時ならせめてADOかOLEDBを使うのを薦める。

100 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 16:16:14 ]
環境 VC++7.0 Windows2000

保存と取り出しができているので成功しているはずなんですが
INIファイルで保存と取り出しはできたのですが保存先がわかりません
プロジェクト名.INIで保存されてるはずのファイルがみつかりません
ファイルの検索でもひっかかりません
Windows2000だとどこか特別な場所に保存されるのでしょうか?
m_pszProfileNameもデバッグ時に確かめましたがプロジェクト名でした


ソース
m_iData1 = 20;
m_sString1 = "mojiretsu";
……

// INIファイルに情報を保存する
CWinApp* pApp = AfxGetApp();
pApp->WriteProfileInt("ProgramData", "IntData1", m_iData1);
pApp->WriteProfileString("ProgramData", "String1", m_sString1);






// INIファイルから情報を取り込む
CWinApp* pApp = AfxGetApp();
m_iData = pApp->GetProfileInt("ProgramData", "IntData1", 0);
m_sString1 = pApp->GetProfileString("ProgramData", "String1", NULL);


101 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 16:23:00 ]
プロジェクト名.INI に保存されるというのはどこに書いてあった?

まあ2000ならwin.ini でもなくてレジストリにマッピングされてると思うけど。

102 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 16:23:02 ]
レジストリ?

103 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 16:25:26 ]
>>101

ここです
www.alpha-net.ne.jp/users2/uk413/vc/VCT_INI.html

104 名前:100 mailto:sage [2007/01/12(金) 16:34:41 ]
レジストリエディタから検索かけたら
プロジェクト名.iniがありましたが

これ直接編集できるんですか?

105 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 16:35:22 ]
ええと、VC++の7.0って.NETの年数無しバージョンだっけ?
ちょっとMFCのバージョンわからんが、

InitInstance() に、SetRegistryKey(_T("アプリのキー")) というのが無いかな?
そこで指定した文字列をキーに、

\\HKEY_CURRENT_USER\Software\アプリのキー\ProgramData\IntData1 に データが入って無いか?
レジストリはスタートメニューからファイル名を指定して実行を選んで regedit と入れれば
レジストリエディタが起動する。

106 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 16:42:40 ]
もう一つ前のバージョンだったか。
NTの時から、INIファイルをレジストリにマッピングする機能があって
INIファイルに書いてもレジストリに書き込まれる仕組みがOSにあった。
その場合は
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping
以下にできる

MFCはそれを使わずにレジストリに切り替える機能もある。
SetRegistryKey()がそれ
任意のファイルにしたければ、APIのWritePrivateProfile・・・ を使えばいいかな。

107 名前:100 mailto:sage [2007/01/12(金) 16:48:02 ]
>>105
.NETの年数無しバージョンです

ありがとうございますありました

これはレジストリエディタを使わないと編集できないということなのでしょうか?





108 名前:100 mailto:sage [2007/01/12(金) 16:55:21 ]
INIファイルをレジストリにマッピングする機能ですか・・・
INIファイルを普通に編集したいならWritePrivateProfileで保存しなければ
いけないんですね

ということはそれも指定してINIファイルを読み込みにいかないといけないのか

109 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 16:58:28 ]
どうしてもファイルにしたければ、SetRegistryKey()を呼ばないで
Private の付いたAPIを呼ぶしかないかなあ、、、
でもこれ16bitWinの互換性に残ってるだけだしな。

110 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 17:11:02 ]
MFCのiniのパスはm_pszProfileName

111 名前:100 mailto:sage [2007/01/12(金) 17:18:34 ]
これだとレジストリでやったほうが簡単そうですね
ありがとうございました

112 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 17:34:12 ]
MFCはレジストリもiniもどっちも同じ方法だし
レジストリとiniの切り替えも簡単

113 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 17:49:50 ]
iniの場合フルパスを意識しないとならんけどな

114 名前:100 mailto:sage [2007/01/13(土) 14:32:27 ]
m_pszProfileNameのパス変えて
他のにも書き込んだり読み込んだりできました

でもパス名変えるとアプリケーション終了時にOSがエラーだしてきます


115 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 14:46:11 ]
MSDN読め

116 名前:100 mailto:sage [2007/01/13(土) 14:57:46 ]
わかりました

117 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 15:44:35 ]
VC++.NET Standard (VC++7.0)使用です

mciコマンドで音を鳴らしていたのですが、音を鳴らす時に1秒くらい固まるのでマルチスレッドにしようとAfxBeginThreadにそこらへんの処理をぶち込みました。
するとmciSendCommandにて303エラーが発生。
おそらくスレッドから呼び出したから安全性がどうのこうのといった内容だと思うのですが
これを回避するにはどのようにすれば良いのでしょうか?



118 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 15:56:12 ]
シングルスレッドだってスレッドから呼び出してることに変わりは無いけどな
303って、MCIERR_ILLEGAL_FOR_AUTO_OPEN?
メインスレッドで自動オープンしたデバイスを別スレッドから触ろうとした?

119 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 16:38:36 ]
エラーメッセージは「指定されたコマンドを自動的に開かれたデバイスで実行することはできません」です
メインスレッドで自動オープンしたうんぬんというのが何を指しているのかは分かりませんが
少なくともmciなんたらの命令は作成したマルチスレッド内でしか使っていません
どうやらwindowメッセージ(MM_MCINOTIFY)の受け取りを親スレッドでしているのが原因らしいです

AfxBeginThreadの中でメッセージ(MM_MCINOTIFY)の受信ってできるのでしょうか?
それとも別の方法でスレッドを作るのかな?CWinThreadとか使った事が無いけど可能ですか?

120 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 16:56:57 ]
すみません捕捉しておきます

mop.dwCallback = (DWORD)pDoc->GetSafeHwnd();
mop.lpstrDeviceType=DeviceType[pDoc->BGMNum];
mop.lpstrElementName=midiFile;


mciErr = mciSendCommand(NULL,MCI_OPEN, MCI_NOTIFY | MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD_PTR)&mop);
mpp.dwCallback = (DWORD)pDoc->GetSafeHwnd();

スレッドの中を抜粋するとこんな感じです
mci関数で曲を止める時は親ウィンドウでやっていますが、エラーメッセージが表示されるのが、ちょうどここのmciSendCommandの所なので
それ以前に親ウィンドウでmci関数の命令を呼び出していないという意味です

おそらくコールバックのハンドルはスレッドのハンドル?を渡せば良い気がしないでも無いですが
スレッド内でのメッセージ処理をCWinThread(もしくはAfxBeginThreadで呼び出したスレッド関数)で受け取る方法が分かれば解決といった感じになりそうです
以前に何か違う方法でスレッドを作っていた気がしないでもないですが、やり方を完全に喪失しておりますし
何よりもMFCを使って初プログラムしているので、なるべくどちらかで処理したいと思っております

これはMFC相談室の方に移動ですか?

121 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 17:30:56 ]
非同期

122 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 13:06:01 ]
全角文字を文字化けせずに、tcpで相手に送信する方法がわかりません・・・。


123 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 14:56:59 ]
送る側と受ける側で文字コードが揃っていればとりあえずできるはず。

124 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 10:36:09 ]
MFCでアプリケーション名を変更する方法を教えてください

125 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 11:12:56 ]
どこで使われる名前のこと言ってるの?

126 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 11:15:49 ]
起動したときに一番左上に表示されるところです

127 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 12:16:28 ]
>>124
ttp://msdn2.microsoft.com/en-us/library/00ak0bwd(vs.80).aspx



128 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 14:58:29 ]
>>127

free((void*)m_pszAppName);
m_pszAppName=_tcsdup(_T("test"));

m_pszAppNameの中身は変わりましたが起動しても反映されてませんでした

129 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 15:26:19 ]
それ見て表示する人がいるから
その人が表示する前に変えないとだめだな

見た目の問題ならウィンドウへ直接書いちゃった方が楽かもしれんな






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<201KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef