★初心者にVisual C++を教えるスレ★ Part17
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
05/02/09 14:29:49お兄ちゃん達が優しく、時には厳しく回答してくれるスレッドです。
■質問するにあたって
・エラーや警告のときはエラーメッセージを書きましょう。
・開発環境も書きましょう。
・できるだけ具体的に。
質問の仕方については次のページが大変参考になります。
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:19HDDのそのセクタかなんかがぶっ壊れてんだろ。
0155デフォルトの名無しさん
05/02/20 06:46:57Win64への以降を睨んで、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>HDDのそのセクタかなんかがぶっ壊れてんだろ。
そうなの?
ヘルプみれなくなった
=オンラインマニュアル
=サポート切れ
かとおもっていたが。。。
0157デフォルトの名無しさん
05/02/20 14:25:360158デフォルトの名無しさん
05/02/20 14:34:520159デフォルトの名無しさん
05/02/20 15:39:210160デフォルトの名無しさん
05/02/20 18:19:54んだが、IntegerをStringにして表示したい。 (Char*でもCStringでもなく)
StringにするにはConvertとかつかうの? 普通に計算したやつを表示する
だけなんだが。
0161デフォルトの名無しさん
05/02/20 18:22:270162デフォルトの名無しさん
05/02/20 18:45:31SprintfもStringもDoubleもIntegerもない。あー、Charもないな。
0163デフォルトの名無しさん
05/02/20 18:47:130164デフォルトの名無しさん
05/02/20 18:56:230165デフォルトの名無しさん
05/02/20 19:04:12デバッグするとき->debug
リリースするとき->release
0166デフォルトの名無しさん
05/02/20 19:11:50リリースするとき〜〜〜〜〜 ->世の中に解き放つ時。
0167デフォルトの名無しさん
05/02/20 19:34:04どうも^^
debugフォルダの実行ファイルを実行すると、画像が表示されないのですが、releaseにしたら表示されるんですか?
0168デフォルトの名無しさん
05/02/20 19:35:30C++でも#include <cstdio>でstd::sprintfは使えるが、
C++っぽいやり方がお望みならstd::stringstreamを。
0169デフォルトの名無しさん
05/02/20 19:49:21両方とも直接実行したらほぼ同じ、debugの方が少し遅いかな。
exeのサイズもデバック情報が入っているので大きいし。
0170デフォルトの名無しさん
05/02/20 19:52:01では、配布するときはreleaseフォルダに画像をいれて配布すればいいのですか?
0171デフォルトの名無しさん
05/02/20 19:53:26リリースする時はデバックコードが入っていない。
0172デフォルトの名無しさん
05/02/20 19:55:01ソフトに必要なファイルは、releaseファイルと一緒に入れる。
同じフォルダーかどうかは、設計による。
0173デフォルトの名無しさん
05/02/20 20:04:59なるほど〜分かりました。
ありがとうございました。
0174160
05/02/20 20:49:53>C++っぽいやり方がお望みならstd::stringstreamを。
sprintfではString変換できないでしょ。
stringstreamはできるんでしょうが、意味的に目的が違うような気がするんですが。
VBだとIntegerがObjectだからInteger.ToString()で変換できたはず。この方が
すっきりするが、Formatなどの表示変換もある。
ManagedではIntegerのオブジェクトがあるの?
0175デフォルトの名無しさん
05/02/20 21:00:31std::string toString(int foo)
{
char buf[sizeof(int) * 3];
sprintf(buf, "%d", foo);
return buf;
}
0176デフォルトの名無しさん
05/02/20 21:02:400177デフォルトの名無しさん
05/02/20 21:08:500178デフォルトの名無しさん
05/02/20 21:13:50それだったらここまでやろうよ
template<typename T> inline std::string toString(T n)
{
return (std::ostringstream() << n).str();
}
0179146
05/02/20 21:19:13皆さんのヒントを参考にソースを見なおしていたら間違いらしい箇所を発見しました。
今度はそこの直し方で困っていますが、とりあえず独力で頑張ってみようと思います。
本当にありがとうございました〜!
0181デフォルトの名無しさん
05/02/20 22:16:200182153
05/02/20 22:38:40ありがとうございます。ためになりました!!
スタートページからPlatformSDKをアップデートしようとしたんですが
更新できる項目がなにもなかったのでwindowsX.hの中を見ていたら
GetWindowInstace関数はGetWindowLongPtr関数を呼び出すように
書かれていました。
それでもこの警告が出てしまうので、実行時には今のところ問題なさ
そうだし、この警告を消すのはあきらめることにしました。
0183デフォルトの名無しさん
05/02/21 00:15:03>>HDDのそのセクタかなんかがぶっ壊れてんだろ。
>そうなの?
>ヘルプみれなくなった
>=オンラインマニュアル
>=サポート切れ
>かとおもっていたが。。。
フルインストールし直してもだめだ。
半年くらい前にいじったときにはヘルプみれたのになー。
こういう現象になった人いないの?
0184デフォルトの名無しさん
05/02/21 00:45:51ttp://www.microsoft.com/japan/msdn/vs_previous/visualc/techinfo/tips.htm
↑の下から4つ目のQの現象じゃないの?
0185デフォルトの名無しさん
05/02/21 02:22:51「どうしても」というわけじゃないなら可変引数の関数は
使用しない方がよろしいかと。
boost::lexical_cast, boost::format でほとんど事足ります。
0186デフォルトの名無しさん
05/02/21 05:52:15ところどころOS固有の処理が必要な箇所があり、プリプロセッサの定義でスイッチしているのですが、
#ifdef _WINDOWS と
#ifdef WINDOWS のどちらを使えばいいのでしょうか。どちらでも通るようなのですが。
0187デフォルトの名無しさん
05/02/21 05:55:15http://live14.2ch.net/test/read.cgi/liveplus/1108932664/
100へ向け協力Plz
0188160
05/02/21 11:21:31やってみましたがエラーがでます。std使うための追加コードとか
ありますか?
0189デフォルトの名無しさん
05/02/21 11:26:54#include <string> // for std::string
#include <cstdio> // for sprintf()
0190160
05/02/21 11:29:43やってみましたが
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:44VCスレと思ってたけど気のせいかな?
0192160
05/02/21 11:35:12>#include <string> // for std::string
>#include <cstdio> // for sprintf()
これってCのstringのことですか? あのー質問の趣旨は
C++のString(オブジェクト?)に変換したいんですが。
0193デフォルトの名無しさん
05/02/21 11:44:43>>162
0194デフォルトの名無しさん
05/02/21 11:45:180195デフォルトの名無しさん
05/02/21 11:47:01>>70
0196デフォルトの名無しさん
05/02/21 11:53:52sprintf で編集して String に変換汁。
0197160
05/02/21 12:13:09これベストのようですね。ありがとう。
>196
boostのメーリングリストができるくらいだから、まともな方法がないみたいですね。
0198デフォルトの名無しさん
05/02/21 15:05:300199デフォルトの名無しさん
05/02/21 15:37:45Win32ではGet/SetWindowLongPtrは単にGet/SetWindowLongを呼び出すマクロになっているだけだからどうしようもない
0200160
05/02/21 15:53:56例で示して。
0201デフォルトの名無しさん
05/02/21 15:57:39それがC++流
0202160
05/02/21 16:09:16作るための最初の例を探してる。
0203デフォルトの名無しさん
05/02/21 16:14:20それともサンプルが理解できないのか?
0204デフォルトの名無しさん
05/02/21 16:28:260205160
05/02/21 16:35:14MessageBox::Show ("data=" + get_str(123)); //これはエラーする
public:
String* get_str(int i)
{
return String::Format(S"{0}",__box(i));
}
0206160
05/02/21 16:36:39えっ、.net以外にもVC++ってあるのか?
0207デフォルトの名無しさん
05/02/21 16:40:24スレ見つかるまでROMってろ
0208160
05/02/21 16:44:050209デフォルトの名無しさん
05/02/21 16:45:38http://pc5.2ch.net/test/read.cgi/tech/1014486422/l50
managed C++ やろうぜ!!
0210160
05/02/21 16:57:14サンクス。
別スレがあったよ。 208はキャンセルしとく。
色々ありがとさん。
0211デフォルトの名無しさん
05/02/21 17:02:410212デフォルトの名無しさん
05/02/21 20:25:19Windows XP にSP2入れなかったか?
俺もXP SP1 + VC5にSP2 入れたら見られなくなった。
だから、XP SP2 ははずした。そしたら見られるようになたヨ。
0214デフォルトの名無しさん
05/02/21 22:30:03VC++自体はまだ手をつけていないのですが、いずれやってみたいなと思っています。
仮にVS.NETでWin32アプリを作ったとしても、利用側に.NET Frameworkが無いと使用できませんか??
C#は.NET Framework利用してるものなので無くてはならないとわかるのですが...
ホントにすみません・・・
0215デフォルトの名無しさん
05/02/21 22:35:500216214
05/02/21 23:16:46レスどうもありがとうございます m( _ _ )m
.NET Frameworkに含まれるクラスを使用するなら必要で、
純粋(?)なC/C++/APIを使う程度なら必要ないということですか??
0217デフォルトの名無しさん
05/02/21 23:18:42そうだよ。
C/C++だってCのみを使うときは*.cファイルでコンパイルできるだろう
0218214
05/02/21 23:44:42.NET環境ない人でも利用できるソフトを作りたいな〜と思っていまして(^^
レスありがとうございました m( _ _ )m
0219デフォルトの名無しさん
05/02/22 00:48:25>Windows XP にSP2入れなかったか?
>俺もXP SP1 + VC5にSP2 入れたら見られなくなった。
>だから、XP SP2 ははずした。そしたら見られるようになたヨ。
サンクス!
問題解決すますた!
しかし....どういうこっちゃい!
0220182
05/02/22 10:05:33>>153の警告を消すのをあきらめるとか言っておい
てやっぱりあきらめられず色々やってました。
結局、WinUser.hというヘッダーファイルにたどり着き
そこにGetWindowLong関数が記述してあったので、
戻り値がLONGとなっていたのをLONG_PTRに書き変えて
リビルドすると警告はきれいさっぱり消えてくれました。
結果目的は達成することができました!ですが最後に質問させてください
勝手に上のようにヘッダーファイルを書き換えてしまったのですが
それによって不具合が生じることなどが考えられるでしょうか?
よろしくお願いします。
0221デフォルトの名無しさん
05/02/22 10:10:110222182
05/02/22 10:25:03戻り値をLONG_PTRにキャストするとLOGN_PTRをHINSTANCEに
変換できないという旨のエラーが出てしまいました。
それと書き換えてない状態でGetWindowInstance関数が戻すの
はあくまでLONG型のデータらしくそれをキャストしても同じ旨の
警告がでるみたいです・・
0223デフォルトの名無しさん
05/02/22 15:37:41症状: 「リリースビルド」でビルドし、「デバッグなしで開始」(Ctrl+F5)で起動すると
プログラムが意図したとおりに動かない。
デバッグビルドおよび、リリースビルドをデバッガ込みで起動したときは正常に動く
質問があいまいですいませんが、このような症状の原因としては何が考えられるでしょう?
0224デフォルトの名無しさん
05/02/22 15:40:12バグ。
起動時の作業フォルダの違いの影響もあるかな。
デバッグビルドでCtrl+f5を試してみるとか、
リリースビルドでもExplorerから起動してみるとか、
試してみるよろし。
0225デフォルトの名無しさん
05/02/22 15:54:28> デバッグビルドでCtrl+f5を試してみるとか、
これは正常に動きました
> リリースビルドでもExplorerから起動してみるとか、
だめだった
デバッガが使えないとつらい……
printfデバッグでがんばります。
0226223
05/02/22 16:11:05メンバ変数のひとつを初期化し忘れ。情けない……
0227デフォルトの名無しさん
05/02/22 20:42:570228デフォルトの名無しさん
05/02/22 20:51:570229デフォルトの名無しさん
05/02/22 23:32:38次のような機能を実装するにはどのようにすればいいでしょうか?
SDIからメニューを選択→自分で作ったダイアログを開く
次の方法を試してみました
まずダイアログベースでCSettingDlgを作る
次に新たなSDIプロジェクトを作って,CSettingDlg.hをインクルードする
この方法ではリソースがうまくCSettingのリソースが利用できず,断念しました
0230デフォルトの名無しさん
05/02/22 23:39:35GetWindowLong の代わりに GetWindowLongPtr を使ってみる?
0231デフォルトの名無しさん
05/02/22 23:54:452.挿入−クラスの新規作成−クラスの種類はFormクラス、クラス名適当、
基本クラスはCDialog、ダイアログIDはさっき作ったやつのIDを
0232デフォルトの名無しさん
05/02/23 00:10:40Win32の場合はただのマクロだよ。
#define GetWindowLongPtrA GetWindowLongA
#define GetWindowLongPtrW GetWindowLongW
(WinUser.hより)
0233デフォルトの名無しさん
05/02/23 00:19:38おとなしくインライン関数にしてくれればいいのに……
メンバ関数の名前がその手のマクロとぶつかってちょっと悩んだ。
0234デフォルトの名無しさん
05/02/23 00:21:120235デフォルトの名無しさん
05/02/23 00:32:410236デフォルトの名無しさん
05/02/23 00:45:50ttp://mtakahashi.com/cgi.cgi?12813
マルチポストは氏ねや
0237デフォルトの名無しさん
05/02/23 02:37:450.123456790123
のように必要以上に桁が多く表示されます(>_<)
0.123
程度で表示させる方法があれば教えてください
0238デフォルトの名無しさん
05/02/23 04:57:47CString::Format()
0239デフォルトの名無しさん
05/02/23 11:29:25>メンバ関数の名前がその手のマクロとぶつかって
定義位置を表示させたら、そのマクロ定義してるトコロが出て
イラッとさせられる。
0240デフォルトの名無しさん
05/02/23 17:56:03>>199
それと221はたぶんGetWindowInstanceを一旦LONG_PTRにキャストしてから
HINSTANCEにキャストするように直せということじゃないか?
0241岐阜
05/02/23 21:19:10引数を照らしあわしてもそんなのないと、
コンパイルが通りません。
なにか、includeかリンクが必要ですか?
0242デフォルトの名無しさん
05/02/23 21:20:09MFC使ってる?
0243岐阜
05/02/23 21:28:300244デフォルトの名無しさん
05/02/23 21:32:280245デフォルトの名無しさん
05/02/23 21:38:270246岐阜
05/02/23 21:41:530247デフォルトの名無しさん
05/02/23 21:52:46MFCのライブラリをリンクするようにする。
それが嫌ならprintfデバッグをやる。(もちろんstd::coutでもいい)
0248デフォルトの名無しさん
05/02/23 22:51:080250デフォルトの名無しさん
05/02/24 01:59:17恐れ多いあいしんかくら様になる!
0251デフォルトの名無しさん
05/02/25 02:34:24VC++で新しいプロジェクトを作ると、ソースファイル、ヘッダーファイルといった名前の
フォルダが自動的に作られますよね。
こいつらの中にソースを作っても、実際にはプロジェクトフォルダの直下に
ファイルが作られていくだけです。
自分でフォルダを作成しても、そのフォルダの作成は実際には反映されていません。
フォルダの作成が自動的に反映されるようにするにはどうすればいいんでしょうか?
0252251
05/02/25 02:35:57環境はVisualStudio.net 2003です。
■ このスレッドは過去ログ倉庫に格納されています