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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん05/02/09 14:29:49
Visual C++入門者・初心者からの質問を、
お兄ちゃん達が優しく、時には厳しく回答してくれるスレッドです。

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

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

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

【前スレ】
★初心者にVisual C++を教えるスレ★ Part16
http://pc5.2ch.net/test/read.cgi/tech/1101022051/

過去スレ、関連スレなどは>>2-5ぐらい。
0153デフォルトの名無しさん05/02/20 05:02:21
質問です。
ウィンドプロシージャ関数内でダイアログを呼び出そうとして
DialogBox(GetWindowInstance(hWnd),MAKEINTRESOURCE(IDD_MYDIALOG),
hWnd,DlgProc);
としました。すると以下のような警告が出てしまいました。
warning C4312: '型キャスト' : 'LONG' からより大きいサイズの 'HMODULE' へ変換します。
どうやらGetWindowInstance関数でインスタンスハンドルを取得した場合に出るようなのですが
その先の改善の仕方がどうにもわかりません、この警告を消す方法を教えてください、お願いします。
0154デフォルトの名無しさん05/02/20 05:13:19
>>152
HDDのそのセクタかなんかがぶっ壊れてんだろ。
0155デフォルトの名無しさん05/02/20 06:46:57
>>153
Win64への以降を睨んで、VCやWindows.hは64bitへ対応する準備がなされている。
まずWin64ではハンドル・ポインタが64bitになるのに、int/longは32bitのまま。
だからハンドル・ポインタを格納する整数型にint/longを使っているとまずいので、
そういう警告が出る。(ハンドル・ポインタ→int/longも警告が出る)

http://pc5.2ch.net/test/read.cgi/tech/1108815602/32
ハンドル・ポインタを整数に格納するときは*_PTRを使うことになっている。
すると64bit対応したと見て警告が出なくなる。

今回のGetWindowInstanceは古いものだとGetWindowLongを呼び出すマクロだが、
最近の物だとGetWindowLongPtrを呼び出すように変更されている。
PlatformSDKをアップデートしてみろ。(直接書き替えても別に悪くは無いが)
0156デフォルトの名無しさん05/02/20 13:54:23
>>154
>HDDのそのセクタかなんかがぶっ壊れてんだろ。
そうなの?
ヘルプみれなくなった
=オンラインマニュアル
=サポート切れ
かとおもっていたが。。。
0157デフォルトの名無しさん05/02/20 14:25:36
↑インストールし直せよ。
0158デフォルトの名無しさん05/02/20 14:34:52
パソコン初心者板か?
0159デフォルトの名無しさん05/02/20 15:39:21
つーかMSに訊けよ
0160デフォルトの名無しさん05/02/20 18:19:54
C++でCのSprintfの代わりは何? Stringと DoubleとIntegerしか使わない
んだが、IntegerをStringにして表示したい。 (Char*でもCStringでもなく)
StringにするにはConvertとかつかうの? 普通に計算したやつを表示する
だけなんだが。
0161デフォルトの名無しさん05/02/20 18:22:27
sprintf
0162デフォルトの名無しさん05/02/20 18:45:31
>>160
SprintfもStringもDoubleもIntegerもない。あー、Charもないな。
0163デフォルトの名無しさん05/02/20 18:47:13
debugとreleaseってどう使い分けるのですか?
0164デフォルトの名無しさん05/02/20 18:56:23
プロシージャって何Cじゃー?
0165デフォルトの名無しさん05/02/20 19:04:12
>>163
デバッグするとき->debug
リリースするとき->release
0166デフォルトの名無しさん05/02/20 19:11:50
デバッグするとき〜〜〜〜〜 ->自分でモンモン・かりかりする時。
リリースするとき〜〜〜〜〜 ->世の中に解き放つ時。
0167デフォルトの名無しさん05/02/20 19:34:04
>>165-166
どうも^^
debugフォルダの実行ファイルを実行すると、画像が表示されないのですが、releaseにしたら表示されるんですか?
0168デフォルトの名無しさん05/02/20 19:35:30
>>160
C++でも#include <cstdio>でstd::sprintfは使えるが、
C++っぽいやり方がお望みならstd::stringstreamを。
0169デフォルトの名無しさん05/02/20 19:49:21
>>167
両方とも直接実行したらほぼ同じ、debugの方が少し遅いかな。
exeのサイズもデバック情報が入っているので大きいし。
0170デフォルトの名無しさん05/02/20 19:52:01
>>169
では、配布するときはreleaseフォルダに画像をいれて配布すればいいのですか?
0171デフォルトの名無しさん05/02/20 19:53:26
+ 自分でデバックコードを書いてあると、ユーザーもそれが見えてします。
リリースする時はデバックコードが入っていない。
0172デフォルトの名無しさん05/02/20 19:55:01
>>170
ソフトに必要なファイルは、releaseファイルと一緒に入れる。
同じフォルダーかどうかは、設計による。
0173デフォルトの名無しさん05/02/20 20:04:59
>>171-172
なるほど〜分かりました。
ありがとうございました。
017416005/02/20 20:49:53
>C++でも#include <cstdio>でstd::sprintfは使えるが、
>C++っぽいやり方がお望みならstd::stringstreamを。

sprintfではString変換できないでしょ。
stringstreamはできるんでしょうが、意味的に目的が違うような気がするんですが。
VBだとIntegerがObjectだからInteger.ToString()で変換できたはず。この方が
すっきりするが、Formatなどの表示変換もある。

 ManagedではIntegerのオブジェクトがあるの?


0175デフォルトの名無しさん05/02/20 21:00:31
>>174
std::string toString(int foo)
{
char buf[sizeof(int) * 3];
sprintf(buf, "%d", foo);
return buf;
}
0176デフォルトの名無しさん05/02/20 21:02:40
自分でIntegerクラス作ればいいじゃん。
0177デフォルトの名無しさん05/02/20 21:08:50
インテジャーってなんじゃー
0178デフォルトの名無しさん05/02/20 21:13:50
>>175
それだったらここまでやろうよ
template<typename T> inline std::string toString(T n)
{
  return (std::ostringstream() << n).str();
}
017914605/02/20 21:19:13
お答えくださった皆さん、ありがとうございました。レス遅れてすみません。
皆さんのヒントを参考にソースを見なおしていたら間違いらしい箇所を発見しました。
今度はそこの直し方で困っていますが、とりあえず独力で頑張ってみようと思います。

本当にありがとうございました〜!
018017505/02/20 21:25:00
>>178
うん、そうも思ったんだけどsprintf()の代わりと書いてたから躊躇してsprintf()仕様にしてみた。
0181デフォルトの名無しさん05/02/20 22:16:20
ここVCのスレだよな?
018215305/02/20 22:38:40
>>155
ありがとうございます。ためになりました!!
スタートページからPlatformSDKをアップデートしようとしたんですが
更新できる項目がなにもなかったのでwindowsX.hの中を見ていたら
GetWindowInstace関数はGetWindowLongPtr関数を呼び出すように
書かれていました。
それでもこの警告が出てしまうので、実行時には今のところ問題なさ
そうだし、この警告を消すのはあきらめることにしました。
0183デフォルトの名無しさん05/02/21 00:15:03
>>156
>>HDDのそのセクタかなんかがぶっ壊れてんだろ。
>そうなの?
>ヘルプみれなくなった
>=オンラインマニュアル
>=サポート切れ
>かとおもっていたが。。。
フルインストールし直してもだめだ。
半年くらい前にいじったときにはヘルプみれたのになー。
こういう現象になった人いないの?
0184デフォルトの名無しさん05/02/21 00:45:51
>>183
ttp://www.microsoft.com/japan/msdn/vs_previous/visualc/techinfo/tips.htm
↑の下から4つ目のQの現象じゃないの?
0185デフォルトの名無しさん05/02/21 02:22:51
>>160
「どうしても」というわけじゃないなら可変引数の関数は
使用しない方がよろしいかと。

boost::lexical_cast, boost::format でほとんど事足ります。
0186デフォルトの名無しさん05/02/21 05:52:15
WindowsとUNIXの両方で走るプログラムを書いているのですが、
ところどころOS固有の処理が必要な箇所があり、プリプロセッサの定義でスイッチしているのですが、
#ifdef _WINDOWS と
#ifdef WINDOWS のどちらを使えばいいのでしょうか。どちらでも通るようなのですが。
0187デフォルトの名無しさん05/02/21 05:55:15
【芸スポ本スレ】強盗自白で非難をあびる優れたタレント活動自粛★99箱【窃盗】@ニュース実況+板
http://live14.2ch.net/test/read.cgi/liveplus/1108932664/

100へ向け協力Plz
018816005/02/21 11:21:31
>175
やってみましたがエラーがでます。std使うための追加コードとか
ありますか?
0189デフォルトの名無しさん05/02/21 11:26:54
>>188
#include <string> // for std::string
#include <cstdio> // for sprintf()
019016005/02/21 11:29:43
>178
やってみましたが
C++\prjVCtest\prjVCtest\Form1.h(2): error C2059: 構文エラー : ')'
C++\prjVCtest\prjVCtest\Form1.h(2): error C2065: 'T' : 定義されていない識別子です。

になります。

使ってるnamespaceは
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
です。
0191デフォルトの名無しさん05/02/21 11:29:44
ここC++スレだっけ?
VCスレと思ってたけど気のせいかな?
019216005/02/21 11:35:12
>189
>#include <string> // for std::string
>#include <cstdio> // for sprintf()

これってCのstringのことですか? あのー質問の趣旨は
C++のString(オブジェクト?)に変換したいんですが。
0193デフォルトの名無しさん05/02/21 11:44:43
>>192
>>162
0194デフォルトの名無しさん05/02/21 11:45:18
ManagedC++スレってなかったっけ?
0195デフォルトの名無しさん05/02/21 11:47:01
>>194

>>70
0196デフォルトの名無しさん05/02/21 11:53:52
>>160 は C++ を知らずに Managed C++ をやろうとしている模様。
sprintf で編集して String に変換汁。
019716005/02/21 12:13:09
>185
これベストのようですね。ありがとう。
>196
 boostのメーリングリストができるくらいだから、まともな方法がないみたいですね。
0198デフォルトの名無しさん05/02/21 15:05:30
.NETのStringならString::Format()で一発
0199デフォルトの名無しさん05/02/21 15:37:45
>>182
Win32ではGet/SetWindowLongPtrは単にGet/SetWindowLongを呼び出すマクロになっているだけだからどうしようもない
020016005/02/21 15:53:56
>198
例で示して。
0201デフォルトの名無しさん05/02/21 15:57:39
っていうか、欲しい機能がなかったら自分で作れよ
それがC++流
020216005/02/21 16:09:16
>201
 作るための最初の例を探してる。
0203デフォルトの名無しさん05/02/21 16:14:20
ヘルプ読めよ。サンプル載ってる。
それともサンプルが理解できないのか?
0204デフォルトの名無しさん05/02/21 16:28:26
.netはスレ違い
020516005/02/21 16:35:14
Stringの結合はどうやるの?
MessageBox::Show ("data=" + get_str(123)); //これはエラーする

public:
String* get_str(int i)
{
return String::Format(S"{0}",__box(i));
}
020616005/02/21 16:36:39
>204
えっ、.net以外にもVC++ってあるのか?
0207デフォルトの名無しさん05/02/21 16:40:24
>>206
スレ見つかるまでROMってろ
020816005/02/21 16:44:05
以後.netも可とする。VC++なので当然だ。
0209デフォルトの名無しさん05/02/21 16:45:38
>>208
http://pc5.2ch.net/test/read.cgi/tech/1014486422/l50
managed C++ やろうぜ!!
021016005/02/21 16:57:14
>209
 サンクス。

 別スレがあったよ。 208はキャンセルしとく。
色々ありがとさん。
 
0211デフォルトの名無しさん05/02/21 17:02:41
とことん他人の書いていることを読んでない香具師だなぁ。
0212デフォルトの名無しさん05/02/21 20:25:19
>>139 >>152 >>156 >>183
Windows XP にSP2入れなかったか?
俺もXP SP1 + VC5にSP2 入れたら見られなくなった。
だから、XP SP2 ははずした。そしたら見られるようになたヨ。
021318205/02/21 21:59:30
>>199 thx!
そうだったんですか、実質的には変わってないということなんですね
移行期間か・・まぎらわしぃーですね
0214デフォルトの名無しさん05/02/21 22:30:03
初歩の初歩で大変申し訳ないです。

VC++自体はまだ手をつけていないのですが、いずれやってみたいなと思っています。
仮にVS.NETでWin32アプリを作ったとしても、利用側に.NET Frameworkが無いと使用できませんか??
C#は.NET Framework利用してるものなので無くてはならないとわかるのですが...

ホントにすみません・・・
0215デフォルトの名無しさん05/02/21 22:35:50
".NET Framework"を使用するプログラムなら必要だね。
021621405/02/21 23:16:46
>>215
レスどうもありがとうございます m( _ _ )m

.NET Frameworkに含まれるクラスを使用するなら必要で、
純粋(?)なC/C++/APIを使う程度なら必要ないということですか??
0217デフォルトの名無しさん05/02/21 23:18:42
>>216
そうだよ。
C/C++だってCのみを使うときは*.cファイルでコンパイルできるだろう
021821405/02/21 23:44:42
どうもありがとうございます。
.NET環境ない人でも利用できるソフトを作りたいな〜と思っていまして(^^

レスありがとうございました m( _ _ )m
0219デフォルトの名無しさん05/02/22 00:48:25
>>212
>Windows XP にSP2入れなかったか?
>俺もXP SP1 + VC5にSP2 入れたら見られなくなった。
>だから、XP SP2 ははずした。そしたら見られるようになたヨ。
サンクス!
問題解決すますた!
しかし....どういうこっちゃい!
022018205/02/22 10:05:33
おはようございます
>>153の警告を消すのをあきらめるとか言っておい
てやっぱりあきらめられず色々やってました。
結局、WinUser.hというヘッダーファイルにたどり着き
そこにGetWindowLong関数が記述してあったので、
戻り値がLONGとなっていたのをLONG_PTRに書き変えて
リビルドすると警告はきれいさっぱり消えてくれました。

結果目的は達成することができました!ですが最後に質問させてください
勝手に上のようにヘッダーファイルを書き換えてしまったのですが
それによって不具合が生じることなどが考えられるでしょうか?
よろしくお願いします。
0221デフォルトの名無しさん05/02/22 10:10:11
それなら戻り値をLONG_PTRにキャストしてやれば良いんじゃね?
022218205/02/22 10:25:03
どうもです
戻り値をLONG_PTRにキャストするとLOGN_PTRをHINSTANCEに
変換できないという旨のエラーが出てしまいました。
それと書き換えてない状態でGetWindowInstance関数が戻すの
はあくまでLONG型のデータらしくそれをキャストしても同じ旨の
警告がでるみたいです・・
0223デフォルトの名無しさん05/02/22 15:37:41
開発環境:Visualstudio .net 2003
症状: 「リリースビルド」でビルドし、「デバッグなしで開始」(Ctrl+F5)で起動すると
プログラムが意図したとおりに動かない。
デバッグビルドおよび、リリースビルドをデバッガ込みで起動したときは正常に動く

質問があいまいですいませんが、このような症状の原因としては何が考えられるでしょう?
0224デフォルトの名無しさん05/02/22 15:40:12
>>223
バグ。
起動時の作業フォルダの違いの影響もあるかな。
デバッグビルドでCtrl+f5を試してみるとか、
リリースビルドでもExplorerから起動してみるとか、
試してみるよろし。
0225デフォルトの名無しさん05/02/22 15:54:28
>>224
> デバッグビルドでCtrl+f5を試してみるとか、
これは正常に動きました
> リリースビルドでもExplorerから起動してみるとか、
だめだった

デバッガが使えないとつらい……
printfデバッグでがんばります。
022622305/02/22 16:11:05
原因があっさり判明しました。
メンバ変数のひとつを初期化し忘れ。情けない……
0227デフォルトの名無しさん05/02/22 20:42:57
乙
0228デフォルトの名無しさん05/02/22 20:51:57
環境が変わると動かなくなる、良くあるバグだね。
0229デフォルトの名無しさん05/02/22 23:32:38
SDIでプログラムを作っています
次のような機能を実装するにはどのようにすればいいでしょうか?
  SDIからメニューを選択→自分で作ったダイアログを開く

次の方法を試してみました
まずダイアログベースでCSettingDlgを作る
次に新たなSDIプロジェクトを作って,CSettingDlg.hをインクルードする
この方法ではリソースがうまくCSettingのリソースが利用できず,断念しました
0230デフォルトの名無しさん05/02/22 23:39:35
>>>222
GetWindowLong の代わりに GetWindowLongPtr を使ってみる?
0231デフォルトの名無しさん05/02/22 23:54:45
1.挿入−リソース−Dialog
2.挿入−クラスの新規作成−クラスの種類はFormクラス、クラス名適当、
  基本クラスはCDialog、ダイアログIDはさっき作ったやつのIDを
0232デフォルトの名無しさん05/02/23 00:10:40
>>230
Win32の場合はただのマクロだよ。

#define GetWindowLongPtrA GetWindowLongA
#define GetWindowLongPtrW GetWindowLongW
(WinUser.hより)
0233デフォルトの名無しさん05/02/23 00:19:38
それにしても、なんで>>232みたいなマクロがあるのかね。
おとなしくインライン関数にしてくれればいいのに……
メンバ関数の名前がその手のマクロとぶつかってちょっと悩んだ。
0234デフォルトの名無しさん05/02/23 00:21:12
?
0235デフォルトの名無しさん05/02/23 00:32:41
C言語時代の名残ではなかろうかと。
0236デフォルトの名無しさん05/02/23 00:45:50
>>229
ttp://mtakahashi.com/cgi.cgi?12813
マルチポストは氏ねや
0237デフォルトの名無しさん05/02/23 02:37:45
Edit Controlを使って,double型の数字を表示させようとすると
0.123456790123
のように必要以上に桁が多く表示されます(>_<)
0.123
程度で表示させる方法があれば教えてください

0238デフォルトの名無しさん05/02/23 04:57:47
_stprintf()
CString::Format()
0239デフォルトの名無しさん05/02/23 11:29:25
>>233
>メンバ関数の名前がその手のマクロとぶつかって
定義位置を表示させたら、そのマクロ定義してるトコロが出て
イラッとさせられる。
0240デフォルトの名無しさん05/02/23 17:56:03
>>220
>>199
それと221はたぶんGetWindowInstanceを一旦LONG_PTRにキャストしてから
HINSTANCEにキャストするように直せということじゃないか?
0241岐阜05/02/23 21:19:10
TRACE();を使いたいんだけど、
引数を照らしあわしてもそんなのないと、
コンパイルが通りません。
なにか、includeかリンクが必要ですか?
0242デフォルトの名無しさん05/02/23 21:20:09
>>241
MFC使ってる?
0243岐阜05/02/23 21:28:30
VisualStudio.net 2003ですよ。
0244デフォルトの名無しさん05/02/23 21:32:28
メ モ この機能は、MFC ライブラリのデバッグ環境でのみ利用することができます。
0245デフォルトの名無しさん05/02/23 21:38:27
Visual C++を使っている ⊇ MFCを使っている。
0246岐阜05/02/23 21:41:53
つまり、コンパイルを通すにはどうすればいいんですか?
0247デフォルトの名無しさん05/02/23 21:52:46
>>246
MFCのライブラリをリンクするようにする。
それが嫌ならprintfデバッグをやる。(もちろんstd::coutでもいい)
0248デフォルトの名無しさん05/02/23 22:51:08
VS2003なら、ATLに似たようなマクロがあったと思われ。
024918205/02/23 23:04:13
>>240

そっか・・そうですよね!気づきませんでした
そのことをまったく考えてなかったです。
目が覚めました。ありがとうございます!
0250デフォルトの名無しさん05/02/24 01:59:17
岐阜を逆から読むと溥儀
恐れ多いあいしんかくら様になる!
0251デフォルトの名無しさん05/02/25 02:34:24
非常に基本的な質問で申し訳ないです。

VC++で新しいプロジェクトを作ると、ソースファイル、ヘッダーファイルといった名前の
フォルダが自動的に作られますよね。

こいつらの中にソースを作っても、実際にはプロジェクトフォルダの直下に
ファイルが作られていくだけです。
自分でフォルダを作成しても、そのフォルダの作成は実際には反映されていません。

フォルダの作成が自動的に反映されるようにするにはどうすればいいんでしょうか?
025225105/02/25 02:35:57
書き忘れました。
環境はVisualStudio.net 2003です。
■ このスレッドは過去ログ倉庫に格納されています