★初心者にVisual C++を教えるスレ★ Part38
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2011/11/03(木) 00:54:48.61お兄ちゃんお姉ちゃん達が優しく、時には厳しく回答してくれるスレッドです。
■質問するにあたって
・エラーや警告のときはエラーメッセージを書きましょう。
・開発環境も書きましょう、特にWindowsForm、MFC、Win32アプリケーションの区別。
・できるだけ具体的に。
質問の仕方については次のページが大変参考になります。
http://www.hyuki.com/writing/techask.html
■回答するにあたって
・回答する場合はその答えに至るための「コツ」も書いてあげると良いでしょう。
(MSDNのどの項目だとか、何のキーワードでGoogleするとか)
・ネタや煽りは軽く流しましょう。
【過去スレ】
Part37 http://hibari.2ch.net/test/read.cgi/tech/1299982561/
Part36 ttp://hibari.2ch.net/test/read.cgi/tech/1273939582/
Part35 ttp://pc12.2ch.net/test/read.cgi/tech/1256645713/
Part34 ttp://pc12.2ch.net/test/read.cgi/tech/1245382769/
Part33 ttp://pc12.2ch.net/test/read.cgi/tech/1235292263/
0157デフォルトの名無しさん
2012/01/21(土) 17:37:56.090158デフォルトの名無しさん
2012/01/21(土) 22:34:23.48コンソールアプリケーションでしばらく遊んでいたのですがこの度windowsフォームアプリケーションへ挑戦することにしました。
>>8でも出ているのですが、コンソールアプリケーションの時には自動でインデントしてくれていたのに、ウィンドウズフォームアプリケーションではインデントしてくれなかったり
this->と打っても反応がなかったりするのは64bitに非対応ということなのでしょうか?
ちなみにVBのVSでは正常に動いていたように思います。
一応再インストールはしてみたのですが効果なし、他の64bit使いの方のお話をお聞かせ下さい
0159デフォルトの名無しさん
2012/01/21(土) 22:40:27.580160デフォルトの名無しさん
2012/01/21(土) 22:44:15.760161デフォルトの名無しさん
2012/01/21(土) 22:59:36.47C++/CLI を使うんなら、ネイティブな C への橋渡しとかを考えている場合以外は C# でやった方がいいよ。
0162デフォルトの名無しさん
2012/01/21(土) 23:00:14.430163デフォルトの名無しさん
2012/01/22(日) 01:30:21.350164デフォルトの名無しさん
2012/01/26(木) 17:29:08.37Solution
Project1
Project2
Project1で定義されているクラスを、Project2で使用する方法を教えていただけないでしょうか?
依存関係を設定すれば使えると思ってたんですが、ハマってしまって。。。
ヘッダーをインクルードして、クラスを実体化しようとするとエラー「LNK2019: 未解決の外部シンボル」が出てしまいます。
環境はVC2002です。よろしくお願いします。
0165デフォルトの名無しさん
2012/01/26(木) 17:30:31.050166デフォルトの名無しさん
2012/01/26(木) 17:37:16.76両プロジェクトともexeの場合ってダメなんでしたっけ?
良く考えればダメですよね。。。
もうちょっと具体的に言うと、Project1が開発アプリで、Project2がテストアプリで
Project1のクラスをProject2で実体化してテストしたいんです。
良いやり方があればご教授いただきたいです。
0167デフォルトの名無しさん
2012/01/26(木) 18:02:54.86すみません、お騒がせしました
でもここに書き込んだら考えが整理された気がしますw
もっと良いやり方ってありましたっけ?有るようでしたら教えて頂ければと思います。
どうもありがとうございました。
0168デフォルトの名無しさん
2012/01/26(木) 22:05:16.82VisualStudio2010 の C++/CLI で以下の通り。
1. 同じソリューション内に form アプリケーション(Project:A)と
クラスライブラリ(Project:B)を作成
2. Project:A で参照の追加を設定し、Project:B をプロジェクトごと参照設定する
3. Project:B に適当にクラス(ClassB)とそのメソッド(ClassB::test)を作る
4. Project:A の適当なところで、 B::Class のインスタンスを作成する
5. そのクラスのインスタンスからメソッドを呼び出す (gcnew B::Class())->test()
うん。ふつーに出来た。
名前空間はちゃんと設定した? 上の例だと A とか B のことだけど。
ちなみにヘッダファイルのインクルードはやってない。
上は exe & dll だけど、マネージの実行ファイルなら exe & exe でも同じように出来る。
0169デフォルトの名無しさん
2012/01/27(金) 00:47:40.44サービスより起動しようとするとすぐに停止になってしまいます。
イベントビューアからログを見るとイベントID7034でした。
これまでは普通に起動していたんですが、
exeの中で使用しているメッセージ出力に使うファイルを、
配置してやったとたんになってしまいました。
特にこれが問題になってるとは思ってなくて、
(Visual Studio 2005でコンパイルしたexeでは問題なかったため)
Visual Studio のバージョンを変えてコンパイルしたので、
何かあるのかなと思ってます。
Visual Studio 2008でサービスを起動するコーディングをする際に、
2005と違う点は何かあるんでしょうか?
0170デフォルトの名無しさん
2012/01/27(金) 12:32:25.27アプリケーションのイベントログにエラーが出てないか?
0171デフォルトの名無しさん
2012/01/27(金) 21:04:33.860172デフォルトの名無しさん
2012/01/27(金) 23:18:13.39それが7034ですね。
>>171
ですよねー。w
コーディングを載せるわけにもいかなくて、
何を載せるべきかと。。。w
0173デフォルトの名無しさん
2012/01/28(土) 00:26:52.91それ、「プログラムは予期せず終了した」だよな。
169 だとどうとでも読めるけど、もとはサービスじゃなくて普通の exe として起動してたの?
サービスとして起動したんだとしても、やることは変わらないだろ。
・元の状態に戻して動作確認
・元の状態で VS2010 でビルドして動作確認
・いろんなところを削って、とにかくただ起動するだけの状態にして動作確認
・少しずつ元の状態に戻していきつつ、どこで異常終了するようになるかを確認
最後のが確認できれば解決したも同然だろ。
もう忘れちゃってるけど、マネージならサービスプログラムとして作ってても他の実行ファイルから
簡単に中身を参照することができるから、普通のプログラムとして起動した後にすぐに
そのサービスプログラムを参照する試験用プログラムを組めばデバッグも楽そうだよな。
まあ触りのない部分だけでもソースを晒してくれたら協力してやるよ。w
0174デフォルトの名無しさん
2012/01/28(土) 01:54:40.26いえ、最初からサービスとして起動するためのexeですよ。
んで、ちゃんと起動するんですよ。
ただ。
その処理の中で、ログを吐く処理があるんですね。
そのログは設定ファイルを読み込んで、そのファイルの中の文言を吐いてるんですけど、
設定ファイルを指定のディレクトリに置いたとたん。
起動しなくなってw
そのファイルを置いてなければ動くんですが、置いたら動かない。。。
よーわからん状態w
ただ、サービスが停止するまでのログはちゃんと吐いてるんで読み込まれてないとか、
読み込みでエラーになってるわけではなさそう。。。
0175デフォルトの名無しさん
2012/01/28(土) 11:42:43.39・単純に起動するだけ
・単純に起動するだけ & その設定ファイルを読み込むだけ
の状態にしてどうなるかを確認。
これで設定ファイルを読み込むようにして不正終了するのを確認できたら犯人が確定だろ。
現状ではそう思い込んでるだけかもしれんだろーが。まずは実証確認をするべきだ。
で、ログ出力機能があるなら、最悪、全ステップの前後にログをはさんで、場所を確定。
それで解決できないならそもそもおまえじゃどうしようもないってことじゃないのか。
どういう構造かは知らんけど、素人が動くだけのプログラムを作ったのなら、
エラー時のフォローなんて入れてないんだろうから、たとえば設定ファイルが xml 形式なら
参照先のノードがなかったり、名前空間が違ってたり、文字コードが違ってたりして
パーサが出してる例外を捕捉してないだけなんて事例はくさるほどある。
171 を自覚しててまだ続けるなら、ほんとうに触りのないレベルに削ったコードを晒せ。
以降はそしたら手伝ってやるよ。
0176デフォルトの名無しさん
2012/01/30(月) 18:17:45.787034がアプリケーションログに出てるの?
システムログじゃなくて?
まあどっちでもいいや
見るべきところがはっきりしてるのにグダグダやってるようじゃ
「お前には無理」としかいいよがない
0177デフォルトの名無しさん
2012/01/31(火) 18:56:00.30POD型の std::vector なんかで使うと
バイナリコードでは最適化されて
REP MOVSQ 命令になってくれたりしますか?
0178デフォルトの名無しさん
2012/01/31(火) 21:13:33.260179177
2012/01/31(火) 23:51:38.39コピー処理はアセンブラ使った方が速いのかな・・・と。
0180デフォルトの名無しさん
2012/02/01(水) 04:47:43.0520行程度の参考書のIF文のサンプルコードを書き込み、
デバッグで実行しただけで固まりそうになる。
VS 2010を買うべきか、VS11まで待つべきか。
0181デフォルトの名無しさん
2012/02/01(水) 04:59:27.61VS11が出たらまた買えばいい
0182デフォルトの名無しさん
2012/02/05(日) 15:12:37.88#include <Windows.h>
static const CHAR str[] = "いやんばか〜ん";
static CHAR func(int x)
{
return str[x];
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
return 0;
}
ご覧の通り、strはfunc()から参照されていますが、
func()はどこからも参照されていない状態です。
これのReleaseビルドを行うと、不要なはずの"いやんばか〜ん"が
なぜかexeファイルの中に埋め込まれてしまうのですが、
これが埋め込まれないようにする方法があれば教えてください。
Visual C++の2005でも、2010 Expressでも結果は同じでした。
いずれもプロパティはデフォルトのまま使っているので、
"/OPT:REF"は有効になっているはずなのですが・・・。
0183デフォルトの名無しさん
2012/02/05(日) 15:18:54.65static const CHAR str[] = "いやんばか〜ん";
#endif
0184デフォルトの名無しさん
2012/02/05(日) 15:20:29.46どこで使われてるかわかったもんじゃないし、実行時の速度に影響するわけでもなし。
0185デフォルトの名無しさん
2012/02/05(日) 15:34:06.36・「はず」じゃなくて、自分で設定して試してみた?
・VC2010 の Win32 コンソールプログラムで試した
- "return str[x];" の行をそのまま -> 実行ファイルに文字列あり
- "return str[x];" の行を retuen NULL; に -> 実行ファイルに文字列なし
結論
/OPT:REF を付けても実行ファイルに出力されない関数内とかを含めてどこかで参照してると
実行ファイルにその参照してるデータも出力されるっぽい。
対策案
しかたないので、使わない部分を #ifdef で囲って切り替えられるようにするとか?
0186デフォルトの名無しさん
2012/02/05(日) 17:40:20.25>>183
#ifdefはどうしてもという場合の最終手段ですねw
>>184
そういうものなんですかねぇ・・・。
static宣言をしていますし、少なくともそのファイル内で
参照されていなければ不要なのは明らかだと思ったのですが・・・。
ちなみにリテラル文字列ではなく配列要素を直接指定しても同じでした。
>>185
すみません、言い方が悪かったです。プロジェクト作成直後の
Releaseビルドの設定は/OPT:REFになっているので、
参照されない関数やデータは削除される「はず」という意味でした。
その後、いろいろ試してみたところ次のことが分かりました。(いずれも2010 Express)
・exeに埋め込まれているのはデータのみで、関数本体は削除されている。
・constを外してもやはりデータは残る(セクションの位置は移動する)。
・データを関数の外ではなく、関数内で直接定義すればデータも削除される。
・複数の関数から同じデータを参照する場合でも、それぞれの関数内で定義すれば
不要であればデータは削除されるし、必要な場合でも1つにまとめられる。
というわけで、たとえ同じデータであっても関数の外には出さずに、
各関数内で定義することでこちらが望む動作になるようです。
とりあえずこれで何とかなりそうです。どうもありがとうございました。
0187デフォルトの名無しさん
2012/02/06(月) 20:05:05.09しようと頑張っているのですが、どうしてもjpeg_create_compressで落ちてしまいます。
struct jpeg_compress_struct comp;
struct jpeg_error_mgr jerr;
comp.err = jpeg_std_error(&jerr);
jpeg_create_compress(&comp); ←ここでおちます;;
0188デフォルトの名無しさん
2012/02/06(月) 20:12:32.880189デフォルトの名無しさん
2012/02/06(月) 20:57:36.390190デフォルトの名無しさん
2012/02/12(日) 18:13:21.14hとかcppファイルは関連付けられていてvisualstudioで開くでのですが、
これらを他のツールから開くときにコマンドラインパラメータ等で行数を指定したりできますか?
開いた瞬間に指定行に移動するようにしたいのですが。
0191デフォルトの名無しさん
2012/02/12(日) 18:32:37.85そのツールにそういう機能があるかどうか、による。
0192デフォルトの名無しさん
2012/02/12(日) 18:41:43.95すいません、書き方が悪かったです。
他のツールからVCExpress.exeを指定してVCExpress.exeで開くという意味です。
どうもググってみましたがそういうスイッチは見当たらないようですね。
0193デフォルトの名無しさん
2012/02/12(日) 21:00:59.010194デフォルトの名無しさん
2012/02/14(火) 13:10:30.960195デフォルトの名無しさん
2012/02/14(火) 13:35:11.20こういうこと?
0196デフォルトの名無しさん
2012/02/19(日) 11:14:57.83最後まで処理した後、勝手にコンソール画面を閉じて終了してしまいますが、
「デバッグなしで開始」で実行すると、コンソール画面を表示したままにしてくれます。
このような違いはなぜ起こるのでしょうか?
「デバッグ開始」のこの仕様は不便に思うのですが、
そのようにしてまで大事なことが他にあるのでしょうか?
0197デフォルトの名無しさん
2012/02/19(日) 11:39:00.30似たような疑問はたくさんあるみたいだから、ぐーぐる先生に質問してみるとか。
if ( ::IsDebuggerPresent() ) system("pause"); みたいなコードを勝手に付けてるんじゃない?
0198デフォルトの名無しさん
2012/02/19(日) 15:07:35.26デバッグしてるのに、終了まで流すのは普通ありえないから
0199196
2012/02/19(日) 15:10:27.22調べてみたんですが、最後止まらずに終わってしまう理由については分かりませんでした。
>>198
なるほど、そういう前提での仕組みですね。
ありがとうございました
0200デフォルトの名無しさん
2012/02/19(日) 17:11:34.751.ラベルと変数を3つずつ(時間、分、秒)用意
2.ボタンを押すとタイマー(intervalは1000=1秒)が起動
3.イベントが発生する度に「秒」の変数を+1する
4.「秒」の変数が59以上になったら「秒」の変数に0を代入して「分」の変数を+1する。分→時間も同様
Windowsフォームアプリケーションのテンプレートから、上のようなタイマーをつくろうとして、
自分が他のタイマーツールと比較した時はズレはなかったのですが、
他の人が試したところ、1分経つ毎に1秒ズレているようなんです。
これはSystem.Windows.Forms::Timer(?)が何かに依存していてダメなんでしょうか?
それともそんなことはなく、文に問題があるのでしょうか?
0201デフォルトの名無しさん
2012/02/19(日) 17:22:55.60現在時間をタイマーに依存するのがダメ、そこまでの精度はない
タイマーイベントの中で現在の時刻を都度取得すればいい
0202デフォルトの名無しさん
2012/02/19(日) 18:00:05.23つまり
1.変数:時間、分、秒、基準時刻を用意
2.タイマーを起動するボタンを押した時の現在時刻を取得、変数:基準時刻に代入
3.タイマーイベント内で現在時刻を取得、基準時刻と現在時刻の相対時刻を取得。変数:時間、分、秒に代入
4.現在時刻を変数:基準時刻に代入
こんな感じにすれば一時停止にも対応出来るって感じですかね
なんとなくつかめました、ありがとうございます
0203デフォルトの名無しさん
2012/02/25(土) 16:34:01.56↓問題です。
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2012
自分はこのようにプログラムを書いたのですが、
実行時間が長すぎることが気にかかります。
http://codepad.org/csyM6H64
どのように改善すれば時間短縮することができるのでしょうか。
お願いします。
このプログラムは、偶数か奇数かなら、
偶数の方が約数の数が多いだろう と思って作ったので、偶数だけを対象にしています。
0204デフォルトの名無しさん
2012/02/25(土) 21:47:13.56宿題スレに行くべきだね
完全力技でなく、map などを使って
1. 一旦素因数分解して、素因数分解の結果から解を求める
2. 素因数への分解仮定で、すでに計算結果の出てるものは再利用する
とかやればいくらか早くなりそうな感じはするけど
0205204
2012/02/26(日) 02:13:52.34失礼、見直したら宿題というわけではないのか
Visual C++でもない気がするけどどのスレなのか分からないから答えておくと
以下の2点だけでそれなりに改善できそうな気がする (>>204は考えてみたら面倒な割にコストが微妙そうだった)
1. 除算するとき、除数と商は対になるはずなので、計算は半分で良い
20の約数(1,2,4,5,10,20)なら
20/4が割り切れた時点で、4と5の両方が求められる
2. sqrt(sum)で除数と商が等しい状態になる、それ以上は計算しなくてよい
具体的には
sum2 = sum >> 1;
for(int idx = 3; idx < sum2; idx++){
を
int sum2 = int(sqrt((double)sum));
for(int idx = 3; idx < sum2; idx++){
として、
if (!(sum % idx)) {count++;}
を
if (!(sum % idx)) {
count++;
int div = sum / idx;
if (div != idx) {count++;} //除数と商が等しい場合を除き、対としてカウントする
}
とする
あと、数値が連続なら特定以上の約数を持つ最小の数値が2で割り切れるのは確実と思うけど、
対象が連続でないので、偶数であることは保証されないと考えるほうが安全と思う
0206デフォルトの名無しさん
2012/02/26(日) 14:44:39.25なるほど!
約数を根本的に考えればそうなりますね!
そんなことにも気づかないなんてばかでした・・・。
それと、
if (!(sum % idx)) {count++;}
を
if (!(sum % idx)) {
count++;
int div = sum / idx;
if (div != idx) {count++;} //除数と商が等しい場合を除き、対としてカウントする
}
とする
のところは、
for(int idx = 3; idx < sum2; idx++){
if(!(sum % idx)){
count += 2;
}
}
if(idx == sum2){
count--;
}
とした方が若干速いと思います。
ありがとうございました!
0207デフォルトの名無しさん
2012/03/10(土) 21:55:24.62フォーム上にあるButtunを押すとフォーム上に線が出てくるようにしたいです。
んでそれは完成しました。
以下、質問です。
クラスウィザードを使って描画クラス(Draw.hとDraw.cpp)を作り、
描画オブジェクトを分離しようとしました。
しかし、Draw.hからFormに線を引くオブジェクトを作成する方法が分かりません。
フォーム上のボタンに書き込んだ
Graphics^ gr2 = this->CreateGraphics();
のthisの部分を
System::Windows::Formsに書き換えるだけじゃ駄目なんですか?
ちょっと分かりにくい質問ですがどなたか回答いただけると幸いです
0208デフォルトの名無しさん
2012/03/10(土) 21:55:47.640209デフォルトの名無しさん
2012/03/12(月) 02:02:52.540210デフォルトの名無しさん
2012/03/12(月) 09:25:48.150211デフォルトの名無しさん
2012/03/12(月) 09:58:12.990212デフォルトの名無しさん
2012/03/12(月) 10:41:04.850213デフォルトの名無しさん
2012/03/12(月) 11:05:01.11そのレベルでC++/CLIは無駄な気がする。
FormやりたきゃC#、C++やりたきゃCLIじゃないほう
両方同時にやってもC++/CLIやるよりまし。
0214デフォルトの名無しさん
2012/03/12(月) 21:21:25.38基本的に上に同じなんだが。
やり方の方ね。
そりゃダメだろ。コンパイルも通らないんじゃないの?
是非はともかく、一番簡単な方法は form のクラスに this->CreateGraphics(); を返すメソッドなりを作って、
Draw.cpp の方でそれを受け取って描けばいいんじゃね?
0215デフォルトの名無しさん
2012/03/13(火) 12:58:49.23具体的には、
「'BOOL' : ブール値を 'true' または 'false' に強制的に設定します」という
警告が大量に出てきて本当にエラーが出ているところが分からなくなるので、
なるべくソースコードは変更せず警告を消す方法が無いかを探しています。
何とかならないでしょうか
0216デフォルトの名無しさん
2012/03/13(火) 12:59:59.72VisualC++2008ExpressEditionを使用しています。
0217デフォルトの名無しさん
2012/03/13(火) 13:12:57.34typedefで定義しちゃうとか
0218デフォルトの名無しさん
2012/03/13(火) 13:47:58.95だったな。
0219デフォルトの名無しさん
2012/03/13(火) 14:08:07.02http://lmgtfy.com/?q=vc+%E8%AD%A6%E5%91%8A
0220デフォルトの名無しさん
2012/03/13(火) 19:32:12.17先生方あざ〜す。
0221デフォルトの名無しさん
2012/03/13(火) 20:59:11.97BOOL a = TRUE;
bool b = a;
とかやってんだろ? だったら、
bool c = ( a != FALSE );
とかって書き直してやれば済むじゃん。
0222デフォルトの名無しさん
2012/03/15(木) 14:09:34.11#include<string>を使えばいいんですかね?
具体的に言えば、
array[0] = 1
array[1] = 2
array[2] = 3
array[3] = 1
array[4] = 2
array[5] = 3
となっているときに、
array[0]~array[2]までを連結させた数字(123)と、
array[3]~array[5]までを連結させた数字とが等しいですね
って出力してくれる関数を探してます。
find()とか使うといいのかなと考えてたんですが、
文字列にしか使えないって書いてあるので、
配列自体に簡単に使える関数はありますか?
0223デフォルトの名無しさん
2012/03/15(木) 14:25:32.76自分で作るしかない
0224デフォルトの名無しさん
2012/03/15(木) 15:08:29.50わかりました。
ありがとうございます。
0225デフォルトの名無しさん
2012/03/15(木) 20:18:14.02memcmp(&array[0], &array[3], sizeof(array[0])*3)
とかで代用できそう
0226デフォルトの名無しさん
2012/03/16(金) 15:31:25.54命令には全く書いていない変数を勝手にインクリメントするのでマジうざいです。
そのプロジェクトを削除してソースコードだけ新規プロジェクトに移植すると直ります。
これはどうしてなんでしょうか?
0227デフォルトの名無しさん
2012/03/16(金) 15:34:32.570228デフォルトの名無しさん
2012/03/16(金) 15:41:31.29内容が変わる位置は特定してるんですが、手の出しようがありません。
0229デフォルトの名無しさん
2012/03/16(金) 16:02:23.830230デフォルトの名無しさん
2012/03/16(金) 16:21:43.31ある配列の値が変更された際に、変更した分だけグローバル変数の値が変わるようです。
もちろん配列にセットしているわけじゃありません。
変数名で全文検索しましたが、明示的に指示してはいませんでした。
スコープを考えてもそれは考えにいです。
0231デフォルトの名無しさん
2012/03/16(金) 17:47:27.220232デフォルトの名無しさん
2012/03/16(金) 19:14:37.540233デフォルトの名無しさん
2012/03/16(金) 19:21:57.820234デフォルトの名無しさん
2012/03/22(木) 23:32:35.36GUIから作るのかデータ構造から作るのかどっちなの?
0235デフォルトの名無しさん
2012/03/22(木) 23:43:12.85経験的には顧客に見せるためにGUIが先に出来上がるケースが多いが
しかし作ること自体は同時進行(´・ω・`)
0236デフォルトの名無しさん
2012/03/22(木) 23:43:23.27V作りながらVM作る
0237営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 22:49:55.84{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.lpszClass = AfxRegisterWndClass(
CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW),
(HBRUSH)::GetStockObject(LTGRAY_BRUSH),
NULL);
return TRUE;
}
0238営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 22:50:45.57{
BOOL bool1 = CWnd::PreCreateWindow(cs);
if (!bool1)
return FALSE;
UINT nClassStyle = (UINT)(CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS);
/* WINUSERAPI */ HCURSOR /* WINAPI */ hCursor = ::LoadCursor(NULL, IDC_ARROW);
/* WINGDIAPI */ HGDIOBJ /* WINAPI */ hGDIObj = ::GetStockObject(LTGRAY_BRUSH);
HBRUSH hbrBackground = (HBRUSH)hGDIObj;
cs.lpszClass = AfxRegisterWndClass(nClassStyle, hCursor, hbrBackground, NULL);
return TRUE;
}
0239営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 22:52:25.34>>238のようにコードを書くのは異常かいな。
0240営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 23:05:39.21自分も程度の差はあるけど 237 ダイレクトな書き方はあんまりしない。
0241営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 02:25:10.04変数の準備と書き込みと破棄の3つの動作がまるまる無駄になってる
この関数が1秒間に何回も呼び出されるようなシロモノだとパフォーマンスにクリティカルなダメージが出る
といっても、コンパイラが潰してくれるかな^^
0242営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 07:23:23.720243デフォルトの名無しさん
2012/04/30(月) 16:46:18.04Test.dllでCTestClsクラスを __declspecエクスポートし、これを同じくVC側のEXEで使用すると、
実行時に「プロシージャエントリポイント ??1CTestCls@@UAE@XZがダイナミックリンクライブラリTest.dllから見つかりませんでした」
というエラーが出て終了します。DLL、EXEともにビルドは通っています。
ttp://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/05.html
を完全に再現する手順を踏んでいます。
EXEのコードはMFC Appウィザードから作ったスケルトンにCTestClsを宣言を追加し
BOOL CWindowtestApp::InitInstance()
{
:
CTestCls test;
}
のみ。CTestClsはメソッド、メンバ変数のない空クラスにしています。
ちなみに、Test.dllで同様にエクスポートした関数は正常に動作します。
原因と対処法を教えてください。
環境
OS:Windows Vista Home
IDE:Visual Studio 6.0 SP2
0244デフォルトの名無しさん
2012/04/30(月) 17:54:33.940245243
2012/04/30(月) 21:05:36.55ありがとうございます。
書き忘れましたので追加します。
ビルド構成はdebugでプロジェクトからF5実行してテストしています。
レスを頂く前に、プロジェクトフォルダに置いたtest.dllをdebugフォルダにコピーして
deubgフォルダのexeを起動したら正常動作し、
何の気なしに再度プロジェクトを走らせたらエラーは消えました。
なので、原因は同名DLLが複数あることではなかったと想像します。
次に、動作の異なるtest.dllを作ってそれぞれに配置するとdeubgフォルダの方が動くようですが、
debugフォルダのDLLを削除したり名前を変更するとプロジェクトフォルダのDLLが適用されます。
逆にプロジェクトフォルダのDLLを削除したらdebugフォルダのtest.dllが動きます。
現状がこのように変わりましたので、エラーの原因が未だ不明ですし、
VSがdebug→プロジェクトフォルダと上位に向かってDLL検索してるのも気持ち悪いです。
0246デフォルトの名無しさん
2012/04/30(月) 21:12:53.830247243
2012/04/30(月) 21:27:03.02それなら同名DLLが両方にあった場合にdebugフォルダの方が動くのはおかしいですよね。
とりあえず優先順位についてはこっちでどうこう言ってもしょうがないのでそれと憶えれば解決しますが、
エラーメッセージの原因が知りたいです。
0248デフォルトの名無しさん
2012/04/30(月) 21:57:41.770249243
2012/04/30(月) 22:16:02.72>>245で書いたように、現在は複数あってもエラーが出ないから原因はそれではないだろうと考えているのです。
昔は複数あったことでエラーになったと仮定して、今は複数あって正常ならその差はなんですか、ということです。
プロジェクトやIDEの設定は変更していません。
バージョンを分けたのは、どっちのフォルダに置いても動くので優先順位を確認するためにしたという
手順によるもので、エラーが出ていた時に複数バージョンあったわけではありません。
0250デフォルトの名無しさん
2012/04/30(月) 22:25:15.25エラーメッセージの原因って
>??1CTestCls@@UAE@XZがダイナミックリンクライブラリTest.dllから見つかりませんでした
って、いってるんだから、原因はそれでしょ
あとはどう調査するかで、Test.dllで公開してる名前の一覧を
> dumpbin /exports test.dll
で確認してみるとか
仮にdllが正しかったとしても、ビルド時の.libファイルが古かった可能性もあるかもしれん
その場合はexe側のimport情報も出力して付き合わせてみるとか
あと、dllの検索順は
1. 実行ファイル(exe)が存在するディレクトリ
2. windowsシステムディレクトリとか
3. カレントディレクトリ
4. 環境変数 PATH に設定されてたディレクトリ
みたいになるので、debugフォルダ=>プロジェクトフォルダは別に上位に向かってdll検索するわけではなく、フォルダ検索の優先順位があるだけの話
よくわからなくて質問してるはずなのに246のアドバイスをおかしいとか断言するのはどうかと思う
0251デフォルトの名無しさん
2012/04/30(月) 23:08:48.05うわがきしてるじゃねーか
0252243
2012/04/30(月) 23:13:21.01「エントリポイントが見つからない」というメッセージから、
直接の原因がそれだという程度の想像はつきます。見つからない原因が分らないという意味でした。
>よくわからなくて質問してるはずなのに246のアドバイスをおかしいとか断言するのはどうかと思う
>>246さんの言うとおりプロジェクトフォルダがデフォルトなら、
他のものが優先されるのが「当たり前」というのは筋が通らないと思いませんか?
デフォルトに優先するものがあるなら、優先順位を決定する設定値があるか、
そもそもデフォルトがプロジェクトフォルダではないと考えるのが正当ではないかと思った次第です。
検索順については副次的な疑問だったのですが、丁寧にありがとうございます。
もう一度最初から作り直してエラーを再現させてから、教えて頂いた方法で探ってみます。
ありがとうございました。
0253デフォルトの名無しさん
2012/04/30(月) 23:21:16.520254243
2012/04/30(月) 23:38:02.45二つのフォルダに完全に同一のDLLファイルがあり、その片方にさらに同一のものをコピーして
ファイルに差分は無くとも「上書きした」という情報を得てエラーを解消するということがあるということですか?
単にオペレーションの差という点でのご指摘であれば、そもそもdebugフォルダに
test.dllがあったかどうかは憶えていないので、上書きかどうかは不明です。
0255243
2012/04/30(月) 23:54:14.06エラーが出なくなった時点ではバージョンはひとつでした。
時系列では以下のようになります。
0.DLLビルド(debug構成の出力のみ。以下同様)、EXEプロジェクト作成(libファイルのフォルダ指定はDLLプロジェクトのdebugフォルダ)
1.EXEプロジェクト実行→エラー(エントリポイントが見つかりません)
2.EXEプロジェクトフォルダのdllをdebugフォルダにコピーしてdeubgフォルダのexe起動→正常
3.EXEプロジェクト実行→正常
4.なぜEXEプロジェクトが正常動作するようになったのか不明なため、片方のフォルダからdllを削除したり
バージョンを分けて両方のフォルダにバージョン違いのdllを配置して優先順位の検証
そんなこと有り得ないというのであれば、私の記憶違いがあると思います。
アドバイスを下さった皆様ありがとうございます。
これらを元に0からチェック項目を作ってやり直してみます。
0256デフォルトの名無しさん
2012/05/01(火) 11:07:16.24優先順位はちゃんとドキュメントに書かれてるだろ
あたりまえなの
■ このスレッドは過去ログ倉庫に格納されています