トップページ⇒tech
1001コメント336KB

【初心者歓迎】C/C++室 Ver.28【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/06/09(金) 10:08:51
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん2006/06/09(金) 10:44:36
余裕で2げっとw

            ,ヘ           ,:ヘ.
               /: : \       /::  !
            /::::.....  \--―‐'.:.:::...  !       >>3 プギャーーーーーーーッ
           /::::::       .:::::::::::::     ',
          ,'::::     /\ヽ_ヽv /:  /\i
           .i::::         √___丶     !
           !:::.          / / tーーー|ヽ   !
        |::::..         ..: |    |ヽ     l             _,-,.、
           i;::::..          | |⊂ニヽ| |     !       i´ヽ    い {,-ゝ.
          ':;::::...      | |  |:::T::::| !  /        l ,人 __,!...!_}ゝ l
         _  \:::::....      ト--^^^^^┤ /         ヽ. '´    ` /
     /   `ヽ `ゝ:::::........      ....../_             /    ァ-- '
     i::.....    ;\!..-ー 、 /⌒ヽ      、\      /    .:/
     ` '''''ー- 、::::/ ,.. .  `/:::   〉‐ 、   \ \   /     ..::ノ
           .ソ'    : /::.   /::  〉     \\,/      .:/
         /i:.       :,'::.   /::  ./ヽ       \!     ..:;'
         / |::       |ヽ.:..    :'::/       \    .::/
          /  !::.    i::.:.:`:‐"ー、_,ノ          \:::/
       / ,/ヾ;:....   /:.:.:.:.:/:::.:..             ヽ、
         | :i   `ー::':.:.::.:.:./\:::::.:.:.               ':;
0003デフォルトの名無しさん2006/06/09(金) 11:45:59
>>1
乙
0004デフォルトの名無しさん2006/06/09(金) 16:43:53
C++でGUIする場合はC++BUILDERしかない?
0005デフォルトの名無しさん2006/06/09(金) 17:04:39
VC++6.0 MFCで自作簡易HTMLレンダリングエンジンの作り方、プログラムが分かる方
居ませんか???
教えていただけると助かります。。。。
0006デフォルトの名無しさん2006/06/09(金) 17:09:01
>>5
マルチ死ね。
0007デフォルトの名無しさん2006/06/09(金) 17:52:59
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。


C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0008TOM2006/06/09(金) 19:00:50
c言語で定期的にディレクトリの中味を監視すれにはどうしたrいいですか?
0009デフォルトの名無しさん2006/06/09(金) 19:03:32
>>8
デーモンの常駐。それかsleep()を発行して、一定時間経過後ディレクトリ内容取得。
0010デフォルトの名無しさん2006/06/09(金) 20:41:37
質問です
listで型を指定するところにクラスや構造体を指定した場合
要素を追加するときどうするんですか?
intやfloatのような型だとpush_back(10)のようにできますが、
クラスだと、どうやって記述すればいいのかわかりません。
0011デフォルトの名無しさん2006/06/09(金) 20:47:31
>>10

class Foo;
std::list<Foo> foos;
foos.push_back(Foo());
Foo foo;
foos.push_back(foo);
0012102006/06/09(金) 20:56:38
>>11
ありがとうございました
関数でもいいんですね
0013デフォルトの名無しさん2006/06/09(金) 20:59:33
>>12
> foos.push_back(Foo());
これの引数はFooという関数を呼んでいるわけではないぞ。
Foo型の一時的なオブジェクトを(コンストラクタ引数なしで)作っている。
0014102006/06/09(金) 21:23:14
>>13
コンストラクタを呼べばいいのですね。わかりました

あと、何度も同じような質問で申し訳ないのですが
listの要素のオブジェクトのメンバ関数を呼ぶ方法がわかりません。
0015デフォルトの名無しさん2006/06/09(金) 21:29:04
// list中の要素のメンバを順に呼ぶ例
class Foo;
std::list<Foo> foos;
...
for(std::list<Foo>::iterator it = foos.begin() ; it != foos.end() ; ++it)
  it->memberFunc();
0016102006/06/09(金) 21:36:23
>>15
ありがとうございました
0017デフォルトの名無しさん2006/06/09(金) 22:50:21
CFOOクラスがあります。
メンバ変数の一つに、CFOO* m_focusFoo を持ち、
メンバ関数の一つに、CFOO* GetFocusFoo() を持ってます。

m_focusFooは、下のようにコンストラクタでNULLで初期化してます。
CFOO::CFOO():m_focusFoo(NULL),・・略{略}

GetFocusFoo()は、下のようにただ m_FocusFoo を返すだけです。
CFOO* CFOO::GetFocusFOO() {
return m_focusFoo;     ←ここで止まる!!!!!
}

CFOOのインスタンスは複数生成するんですが、
m_focusFooには自分自身が入ってる場合もあれば
NULLの場合もあれば
他のインスタンスが入る場合もありえます。

GetFocusFoo()を呼び出してる側では、
NULLが返ってきてもいいようになってまして、
ためしに return NULL; としてみると落ちないでちゃんと動きます。
(もちろん正規の動きでは無いですが、
少なくとも呼び出し側は仮にNULLが返されても安全なようにはしてある、という意味です。)

で、一応コンパイルは通ってまして、
win2000の環境では動くのですが、xpのマシンで走らせるとエラーで落ちます。

デバッグしてみると、return m_focusFoo;のところで止まっているようで、
CFOOのコンストラクタの初期化リストでちゃんと初期化しているはずの変数も含め
全ての変数に「式を評価できません」とエラーが出てます。

return の m_FocusFoo の評価部分で落ちて、
しかもそれが環境に依存するというのは、どこの書き方が悪いと考えられますでしょうか?
0018172006/06/09(金) 22:57:31
一応age
0019デフォルトの名無しさん2006/06/09(金) 23:09:32
>>18
再現する最低限のソースを貼れ。
0020172006/06/09(金) 23:13:38
長いのでエスパー的にお願いします。
0021デフォルトの名無しさん2006/06/09(金) 23:14:50
【緊急事態】日本終了のお知らせ【緊急事態】

◆北朝鮮への経済制裁等を行なうはずの「北朝鮮人権法案」だったのだが◆
◆民○党案は「脱北者」と称する棄民&工作員を呼び込む外患誘致だった◆
◆突如まともな自○党案に民○党案を織り交ぜる妥協話が・・ヤバ過ぎ!!◆

まとめサイト
http://www14.atwiki.jp/akiramenai/pages/4.html

これが通れば日本にチョンが何十万人とやってきます。13日に可決予定です。
時間がもうありません。これを見た方はコピペ&凸お願いします!!

【日本終了】朝鮮人を日本に大量移住 反対 OFF(抗議運動作戦本部)
http://off3.2ch.net/test/read.cgi/offmatrix/1149833514/l50
0022172006/06/09(金) 23:47:41
今気づいたのですが、
GetFocusFoo()の処理の先頭に、
WinAPIのMessageBoxを差し込んで試してみたら、
なぜかWin2000の方で実行すると起動直後にGetFocusFoo()は呼ばれなくて、
xpの方で実行すると呼ばれるみたいです。

OSによって実行の順序が変わるなんてありえるんですかね?

処理的には、GetFocusFoo()が呼ばれるからにはインスタンスが出来上がってるわけで、
となれば少なくともm_focusFooはコンストラクタでNULLに初期化されてるはずだと思うのですが、
これをreturnするところで落ちるってのがいったいどういうことなのかよく分かりません。
0023172006/06/09(金) 23:57:45
何かとりあえず直りました。
実行される順番が違うってことが分かったんで、
勘で適当に関係ありそうなところをいじって見たら直りました。
なんで直ったか分かりませんし、
説明しようにも内容が入り組みすぎてるので、無理です。すいません。
お騒がせしました。
0024デフォルトの名無しさん2006/06/10(土) 00:19:20
>>23
そんなに入り組んだプログラムを作っているから、
17のようなわけわからないことが起きるんだよ。
0025デフォルトの名無しさん2006/06/10(土) 01:42:50
OSでWindowsXPとLinuxを使っています。
プログラミングはC#をちょっとだけです。

質問なんですが、
標準Cライブラリ http://ja.wikipedia.org/wiki/%E6%A8%99%E6%BA%96C%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA
ここに載っていない関数は、大まかに言うと各環境の独自拡張と考えてよいのでしょうか?
0026デフォルトの名無しさん2006/06/10(土) 01:49:39
>25
「主な機能」と書いてあるじゃないか。全部ってわけじゃない。
0027デフォルトの名無しさん2006/06/10(土) 16:24:07
>>25
「拡張」っつーと少し語弊がある気がするな。
CはもともとJavaみたいに、その言語環境だけでどうこうするように考えて
作られた言語じゃない。

CはOSのシステムコールやFORTRAN等で書かれたライブラリルーチン等を
直接呼べるように設計されているが、
別にOSのシステムコールは「C言語を拡張するため」のものではない。
0028デフォルトの名無しさん2006/06/10(土) 20:15:18
typedef class AClass
{
public:
AClass **ppMe;
};

というクラスがあったとして

AClass *pTest = new AClass();
pTest->ppMe = &pTest;

とやってppMeメンバに自分のアドレスを持つ変数のポインタを代入したいんですが
これをオペレータ等を使って見た目上1ステップで書くことは可能でしょうか?
0029デフォルトの名無しさん2006/06/10(土) 20:27:21
なんでthisじゃダメなんだ?
0030デフォルトの名無しさん2006/06/10(土) 20:32:58
「自分を参照している変数」に対してアクセス(解放時にNULL代入等)したいからです
0031デフォルトの名無しさん2006/06/10(土) 20:33:43
だから、コンストラクタでppMe = this;とでもすればいいじゃん。
0032デフォルトの名無しさん2006/06/10(土) 20:37:41
>>28 は「自分を参照している変数」じゃなく、「自分へのポインタを自分に設定している」だが?
0033282006/06/10(土) 20:39:31
AClassのメソッドからpTestの値を書き換えたいということなんですが・・・
ちなみにthisはAClass*、ppMeはAClass**です
0034デフォルトの名無しさん2006/06/10(土) 20:41:04
AClassのメソッドからpTestを書き変えればいいじゃん。
0035デフォルトの名無しさん2006/06/10(土) 20:43:13
pTestのメンバ情報からpTestの指す先を書き換えることは無理じゃないか?
グローバル変数に保存してそれを参照しないことには。
0036282006/06/10(土) 20:49:21
メソッドから*this->ppMeに対してアクセスすれば
外のpTestの内容を書き換えることは可能です
で、今回の質問はクラス生成、代入時に、
同時に左辺の変数のアドレスをppMeメンバに代入したいということなんですが
0037デフォルトの名無しさん2006/06/10(土) 21:00:11
コンストラクタでthisのポインタを取得しても、そのポインタのポインタを保持
しているエリアはローカル変数だから、コンストラクタを抜けた時点でppMeの
アドレスが無効になる。

やはりどこかでグローバル変数が必要か。
0038282006/06/10(土) 21:05:46
グローバル変数ではありませんが、他もしくはAClassの別のインスタンスが
AClassのインスタンスのアドレスを保持する変数を持つことを想定しています
リストやツリーのようなもんです(根っこだけは別ですが)
0039デフォルトの名無しさん2006/06/10(土) 21:07:55
なんだよCompositeパターンか。
0040デフォルトの名無しさん2006/06/10(土) 21:10:47
>>28 は自分に自分を設定しているじゃん。だから混乱するんだよ。
0041デフォルトの名無しさん2006/06/10(土) 21:15:48
というか、>>28 や、>>33 で言ってることと、>>38 は違わね?
0042282006/06/10(土) 21:33:50
自分のポインタを保持している変数を別のインスタンスが持っているか
どこかのスコープで保持されている変数が持っているかの違いだけで、
やっている事自体に変わりはありません
質問の主旨とかけはなれてきているので
しばらくはppMeを設定するメソッドを用意して対応することにします
ありがとうございました
0043デフォルトの名無しさん2006/06/10(土) 21:34:03
C++で時間を扱うのってどうやるんですか?
例えば、0から10までの数字をランダムで一定時間ごとに
足していって1000になるまでかかった時間を表示するプログラムみたいなの
つくるためにはどうすればいいですか?
0044デフォルトの名無しさん2006/06/10(土) 21:37:47
開始時刻を保存しておいて、終了時刻から引けばいい。
秒単位なら time() さらに高精度でほしいなら clock() で現在時刻を取得できる。
0045432006/06/10(土) 21:40:44
>>44
ありがとうございました。
0046デフォルトの名無しさん2006/06/11(日) 01:32:06
time()やclock()ってCPUの違いによって変わらないの?
OSあたりで調整しているの?
0047デフォルトの名無しさん2006/06/11(日) 01:36:53
クラス定義でインライン記述を使っていい条件がよくわからないのですが、
何か差があるんでしょうか?
全関数のプロトタイプとインプリメンテーションは別にした
方がいいのでしょうか?
0048472006/06/11(日) 01:42:30
すいません。言語はC++です。
templateを使うクラスを記述するときに
インラインの方が記述しやすかったもので・・・
0049デフォルトの名無しさん2006/06/11(日) 01:45:25
>>46
そりゃそうだ。
clock() はいろいろ違うだろうけど CLOCKS_PER_SEC で差を吸収することができる。
0050デフォルトの名無しさん2006/06/11(日) 01:47:28
おまえら前スレを成仏させてあげてください
0051デフォルトの名無しさん2006/06/11(日) 01:48:35
>>47
インターフェースをクラス定義で記述するつもりなら、
別にしたほうがインターフェースと実装が分かれていて良いと言える。

インターフェースを別の文書で記述するなら、
クラス内で定義してしまってもほとんど問題ない。
0052デフォルトの名無しさん2006/06/11(日) 01:51:41
ポインターの勉強を始めたんですが、分からないことがあるので教えてください。
環境は VC++2003/2005 でプロジェクトのプロパティでコンパイル言語をC言語にしています。

#include <stdio.h>

int main() {
    char exe[] = "test.exe";       /* �@ */
//  char *exe = "test.exe";        /* �A */
    char *p = strrchr( exe, '.' );
    if( p ) {
        strcpy( p, ".ini" );
    }
    printf("%s\n", exe);
    return 0;
}

�Aの方を有効にすると実行時にエラーになってしまいます。
�@も�Aもやっていることは同じだと思っていたのですが、何か違いがあるのでしょうか?
0053デフォルトの名無しさん2006/06/11(日) 01:53:00
どうやってOSで調整しているんだろう?>clock()
for文などで何回も空ループさせて、計測しているのか?
CPUの周波数があらかじめわかると計算できるけど
OSからみれば、どのCPUに搭載されるかわからないからね〜
0054デフォルトの名無しさん2006/06/11(日) 01:57:36
>>53
まぁあれだ。オープンソースのOSのソースみればわかるよ
0055デフォルトの名無しさん2006/06/11(日) 02:04:37
>>52
それらは全く別物。


char a[] = "abc";

は

char a[] = {'a','b','c','\0'};

と同義。

char *a = "abc";

は、メモリ上のどこかに確保された文字列定数「"abc"」へのポインタを、ポインタ変数「a」の初期値としている。



文字列定数は、あくまで定数だから変更しちゃいかん。
0056デフォルトの名無しさん2006/06/11(日) 02:09:51
>>52
この手の間違いはC初学者にはとても多いので、何か命名した方がいいと思った

「リテラルレイプ」とか

そうすれば回答者は「リテラルレイプでググれ」で済むし、
質問者も「リテラルレイプはCでよく陥るミスなんだな」と
理解が早まると思ったんだがどうか
0057472006/06/11(日) 02:53:42
>>51
ありがとうございます。
ヘッダをインターフェース確認ファイルとして使うときに分ける感じでしょうか?
VisualC++ですと1クラス1ヘッダが推奨されているようなんですが、
組み込みのSTL等見るとインラインに加えて複数クラスが
ヘッダで定義されているんですが、
どっちがよいのでしょうか?
0058522006/06/11(日) 03:04:49
>55
素早い回答ありがとうございます。

char a[] = "abc";
と
char *a = "abc";
では実際に確保されるメモリ領域が異なるということでしょうか?

char a[] = "abc"; はヒープ領域?に確保される。
char *a = "abc"; は静的領域?に確保される。
静的領域に確保されたメモリは変更できない。

という理解でいいんでしょうか?
0059デフォルトの名無しさん2006/06/11(日) 03:36:21
data/bss/stack/moat/heapで区別するなら文字列実態はdataセクション、
ポインタはstack(auto) or bss(static),
配列の名前はおそらく即値でアセンブラ命令に直接入るだろうな。
0060デフォルトの名無しさん2006/06/11(日) 03:43:41
>>59
ちょwwwww

どうみても初心者なのにその解説かよwwww
0061デフォルトの名無しさん2006/06/11(日) 08:09:30
>>58
# とおりすがりですが、、、、

実装される領域に注目しすぎると本質を見失うかも。
定数(const)かどうかに注目したほうが理解しやすいと思います。

char a[] = "abc";
これは、配列(メモリ上の領域)の定義。(const指定子をつけていないので書き換え可能)
char *a = "abc";
これは、ポインタの定義。
リテラル("abc")を指すように初期化される。
通常リテラルはconst属性を持つ定数配列なので、書き換えができない。
コンパイラにうるさくwarningさせれば、この初期化が問題を起こしうることは
コンパイラが指摘してくれるはずです。
また、コンパイラオプションによって、リテラルを定数として扱わないように
することができる処理系も存在します。このようなオプションを指定すれば、
�Aのソフトも実行することは可能です。
ただし、この場合、処理系がどのようにリテラルをメモリ上に格納しているのか、
実装方法に対して十分に注意しないと、さらに予期せぬ動作につながるため
お勧めはできません。
0062552006/06/11(日) 08:33:14
>>58
配列は理解してる前提で書いたら、配列は理解してなかったのか…。


前者(a[])である配列の方は、文字列「abc\0」を格納するのに必要な領域を確保し、
それ全体に「a」と言う名前を付ける、と言う配列の定義。

後者(*a)であるポインタ変数の方は、どこかの領域を指すための値を格納するのに必要な領域なを確保し、
その領域に「a」と言う名前を付け、文字列定数「abc\0」の先頭を指すポインタ値で初期化しているポインタ変数の定義。


# ちなみに、文字列定数は、一般的には文字列リテラルと呼ばれる。
# 「文字列定数」と書いた方が、「何故、変更するべきモノではないのか?」がわかりやすいかと思った。
0063デフォルトの名無しさん2006/06/11(日) 09:02:20
だから、細かいことを言えば、pはchar*よりもconst char *である方がよい。
そうすれば書き換えようとしても、コンパイル時にエラーになる。

特にC++では文字列リテラルを非constなchar*へ初期化・代入できるのは、互換性のためとなっていたはず。
0064デフォルトの名無しさん2006/06/11(日) 13:05:24
>>56
そのネーミングセンスに感動した
0065デフォルトの名無しさん2006/06/11(日) 16:09:12
すみません。
今日からプログラミングをはじめてみたんですが、
プログラムが動きません。
色々ネットであさってみたのですが、よく理解できないので
ヒントでもいいので教えてください。
0066デフォルトの名無しさん2006/06/11(日) 16:10:56
>>65 http://www.kouno.jp/home/c_faq/
0067デフォルトの名無しさん2006/06/11(日) 16:11:30
>>65
何をどうしてどのように動かないのか書かないと口の出しようもない。
0068デフォルトの名無しさん2006/06/11(日) 18:16:31
すいません。質問です。
今日からはじめようと思うんですが、CとC++どっち覚えればいいですか?
と質問したいところですが、わからないっていわれたんで、

C++でできることはCで全部できますか?教えてください。
0069デフォルトの名無しさん2006/06/11(日) 18:21:20
C++のリファレンスがネットで観れるところはありませんか?
MSDNとかじゃなくてもうちょっと綺麗にまとまった感じで
0070デフォルトの名無しさん2006/06/11(日) 18:21:26
できるよ
0071デフォルトの名無しさん2006/06/11(日) 18:21:46
あるよ
0072デフォルトの名無しさん2006/06/11(日) 18:29:09
URLを教えてください!
0073デフォルトの名無しさん2006/06/11(日) 18:34:36
>>72
俺はC++に関してならここの「標準 C++ ライブラリ」のところを見ている。
http://www.microsoft.com/japan/developer/library/vclang/stdlbhm.htm
0074デフォルトの名無しさん2006/06/11(日) 19:35:37
>>68
「できること」というのがプログラムを作成するという意味なら可能
言語の機能を指してるなら不可能
0075デフォルトの名無しさん2006/06/11(日) 19:54:25
>>67
すみませんでした。ちょっと頭痛かったのでそこらへん忘れていました。
borlandをsetbccを使って設定までしたのですが、
作ったのを動かす(?)ことができません。
たぶんborlandの使い方が理解できていないと思うのですが・・・

作ったやつをクリックすると1.exe 1.obj 1.tbsが作成されます。
プログラムの内容は文字の表示です。

その他書くことがあればお願いします。
0076デフォルトの名無しさん2006/06/11(日) 20:04:39
>>75 「何が動かないのか」が書かれていないが。
0077デフォルトの名無しさん2006/06/11(日) 20:04:44
>>75
ttp://www6.plala.or.jp/mnagaku/cmag/ac20005/
0078デフォルトの名無しさん2006/06/11(日) 20:51:50
>>70>>74
わかりました。ありがとうございます。
C言語から始めて、色々身に付けてC言語じゃ不便と感じるようになってからC++に手出したいと思います。
0079デフォルトの名無しさん2006/06/11(日) 21:45:41
初心者なんですがプログラムつくるまえに仕様書的なもの書くじゃないですか?
書き方とか参考になるサイトないですか?なにかけばいいやら…
0080デフォルトの名無しさん2006/06/11(日) 21:54:31
まず、マトモな日本語で概要説明が書けることが重要。
そこが欠落した人の図面はどこか破綻している事が多い。
0081デフォルトの名無しさん2006/06/11(日) 22:00:31
エラー処理がよくわからないのですが、
たとえばスタッククラスのpopメソッドで
空っぽなのに実行された場合など
どういうエラー処理をすればいいんでしょうか?
例外をthrowしたり、assert()を呼んだりの区別がよくわかりません。
0082デフォルトの名無しさん2006/06/11(日) 22:02:43
>>81
C++ ならとりあえず例外投げとけ。
0083デフォルトの名無しさん2006/06/11(日) 22:03:59
>>81
好きにしろ。ここはお前のプログラムの仕様を考えてやるスレじゃいないんだ。
0084デフォルトの名無しさん2006/06/11(日) 22:08:03
結構大事な話題だと思うけどね

表明とかEiffelの契約とか
0085デフォルトの名無しさん2006/06/11(日) 22:30:45
むしろ例外でpopした値を返せ
0086デフォルトの名無しさん2006/06/11(日) 22:33:23
>>75
その1.exeを動かせ。それがお前の作ったプログラムだ。
0087デフォルトの名無しさん2006/06/12(月) 00:00:04
システムフックに関して質問させてください。
いずれかのウィンドウがアクティブになるたびに処理をしたいので、
下記のようなシステムフッククラスを作成しました。
(長いので要点のみ)

// フックの登録
BOOL CHook::Set(HWND hWnd)
{
    m_hHook = ::SetWindowsHookEx( WH_CBT,
    (HOOKPROC)CHook::CBTProc,
    GetThisInstH(), // システムフックなのでNULLじゃなくインスタンスハンドル渡す
    GetWindowThreadProcessId(hWnd, &lpdwProcessId));
}
0088デフォルトの名無しさん2006/06/12(月) 00:00:35
// フックの処理
LRESULT CALLBACK CHook::CBTProc(int p_nCode, WPARAM p_wParam, LPARAM p_lParam)
{
    // 処理してはいけないメッセージなので、次へ渡す
    if( p_nCode < 0 || p_nCode == HC_NOREMOVE)
        return ::CallNextHookEx( m_hHook, p_nCode, p_wParam, p_lParam );

    if( p_nCode == HCBT_ACTIVATE ) // ここがアクティブウィンドウが発生したときの処理
        TRACE0(_T("アクティブ化\n"));

    return ::CallNextHookEx( m_hHook, p_nCode, p_wParam, p_lParam );// 次のフックへと繋げる
}

また、このフックハンドルや必要な変数はグローバルにし、他とかぶらないようにしてあります。

#pragma data_seg( ".CKHookData" )
HHOOKCHook::m_hHook = NULL;
#pragma data_seg()

この状態で使用すると、フックを呼び出したウィンドウがアクティブになったときにしか反応しません。
これではローカルフックと変わりません。
いろいろ試してはみたのですがどうにも・・・どなたかわかる方、ご教授願います。
MFCアプリで使用するので、DLLはMFC DLL の拡張モードで作成してあります。
0089デフォルトの名無しさん2006/06/12(月) 00:18:15
>>88
GetWindowThreadProcessId(hWnd, &lpdwProcessId));

フックを呼び出したウインドウと同じスレッドのみって自分で指定してるだろが。
システム全体にフックを有効にしたければ、ここをNULLにする。
0090k ◆WFGp1NZuiw 2006/06/12(月) 00:23:36
メモリを解放せずに,デストラクタのみを呼び出す auto_ptr のようなものを
作りたいのですが,うまくいきません.アドバイスいただけないでしょうか?
(placement new と組み合わせて使用することを想定)

書いてみたのは↓みたいなコードで,「pointer_->PointerClass();」のところで
文句言われてしまいます.

template<class PointerClass> class CleanPointer
{
public:
CleanPointer(PointerClass *pointer)
: pointer_(pointer)
{

};
~CleanPointer()
{
pointer_->PointerClass();
};

private:
PointerClass *pointer_;
};
0091デフォルトの名無しさん2006/06/12(月) 00:26:25
 >「pointer_->PointerClass();」のところで
はて……コピペミスではないようだが……高度な釣りかな。
0092デフォルトの名無しさん2006/06/12(月) 00:26:32
>>90
デストラクタの呼び出しは ~PointerClass() だよ。
しかしそのクラスが何の役に立つのかわからんな。
0093デフォルトの名無しさん2006/06/12(月) 00:26:42
>>90
デストラクタを呼ぶにはpointer_->~PointerClass();だぞ。
0094デフォルトの名無しさん2006/06/12(月) 00:26:55
>>89
できた・・・orz
即答ありがとうございます。
できた…かも。
今日一日潰れた問題でしたが、解決してよかったです。
ありがとうございました。さっそく必要な処理を加えていこうと思います。
0095k ◆WFGp1NZuiw 2006/06/12(月) 00:28:58
>>92, >>93
あ,ほんとだ.ありがとうございました.
0096京大生www2006/06/12(月) 01:18:09
Cです。
環境はどこまでいえばいいか分かりませんが、コンパイラはbcc32

テキストファイルのa.textが
abc
def
ghi
だとします。

char *hako[3];
で定義した配列ポインタを使って

*(hako+0) = abc
*(hako+1) = def
*(hako+2) = ghi

というかんじでファイルから配列にコピーしたいのですが、どうすればいいのでしょうか?
0097デフォルトの名無しさん2006/06/12(月) 01:23:03
>>96
宿題は宿題スレへ。
0098デフォルトの名無しさん2006/06/12(月) 01:23:57
これが今の京大生だったら泣けるw
0099京大生www2006/06/12(月) 01:24:16
宿題スレにも書いた。
早く答えて欲しい、製作意欲が失せてしまう
0100629 ◆zZtDbr6Gfc 2006/06/12(月) 01:25:24
答え聞いてるのに制作意欲も何もないよね
0101デフォルトの名無しさん2006/06/12(月) 01:25:59
いつかのトリップが残ってやがったorz
■ このスレッドは過去ログ倉庫に格納されています