トップページ⇒tech
986コメント346KB

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2011/11/03(木) 00:54:48.61
Visual C++入門者・初心者からの質問を、
お兄ちゃんお姉ちゃん達が優しく、時には厳しく回答してくれるスレッドです。

■質問するにあたって
・エラーや警告のときはエラーメッセージを書きましょう。
・開発環境も書きましょう、特に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/
0900デフォルトの名無しさん2013/03/29(金) 14:40:56.74
検索能力が皆無のお前には無理
0901デフォルトの名無しさん2013/03/29(金) 17:56:46.48
>>899
できる
0902デフォルトの名無しさん2013/03/30(土) 02:58:10.24
>>901
ウィザードではなくて
default.js
Templates.inf
.vsdir
.vsz
これらを直接変更加えて追加したら出来ました
ありがとうございました
0903デフォルトの名無しさん2013/03/30(土) 14:35:55.54
構成プロパティにある作業ディレクトリをDefault.jsで指定するにはどうすればいいですか?
0904デフォルトの名無しさん2013/04/02(火) 01:21:39.22
Main.exeからA.dllを呼んでA.dllからB.dllを呼んだ場合
A.dllのエディットコントロールではキー入力が処理されるのに
B.dllでは処理されません
どうすればB.dllのエディットコントロールでもキー入力が処理されるようになりますか?
0905デフォルトの名無しさん2013/04/02(火) 02:33:56.94
TranslateMessageとDispatchMessageをちゃんと呼んでるか確認
0906デフォルトの名無しさん2013/04/02(火) 09:49:30.13
>>903
var config = proj.Object.Configurations('Debug');
config.WorkingDirectory = Path;
でいけるはずだがエラーになるな

Default.vcxprojに
<LocalDebuggerWorkingDirectory>Path</LocalDebuggerWorkingDirectory>
追加したらいい
0907デフォルトの名無しさん2013/04/02(火) 10:21:55.84
>>905
MainでTranslateMessageとDispatchMessageを呼んだら実現できました

さらにリターンキーでデフォルトボタンが押された動作にしたかったので
メッセージループ内でDLLダイアログハンドルを保持させるstatic変数を宣言
→DLL内でFindWindowを使用してMainウィンドウハンドルを取得
→ユーザーメッセージを使用してDLLからMainへダイアログハンドルを送信
→IsDialogMessageで通常通りの分岐
最終的にはこのような感じに落ち着きました
ありがとうございました
0908デフォルトの名無しさん2013/04/04(木) 17:55:52.74
今日の釣堀
http://itpro.nikkeibp.co.jp/article/Watcher/20130331/467401/
0909デフォルトの名無しさん2013/04/04(木) 18:54:58.46
VisualC++2008Expressです。

1つのソリューション内に2つのプロジェクト、A(exeプロジェクト)、B(DLLプロジェクト)を作ったとします。
AとBは同じモジュール(C++コード)を共有しており、Aでコンパイルした結果の.objをBのコンパイルでリンクさせたいとします。

このとき、対象となる共有モジュールをBでリンクさせるためには以下の方法があります。

方法1:
・プロジェクトAに共有モジュールをソリューションエクスプローラに登録
・プロジェクトBに共有モジュールをソリューションエクスプローラ上でプロジェクトAからコピーしてやる

方法2:
・プロジェクトAに共有モジュールをソリューションエクスプローラに登録
・プロジェクトBのプロジェクトのプロパティのリンカ設定で追加の入力から共有モジュールの.objファイルを指定する

なお、共有モジュールは複数あり、以後追加されていきますし、DLL化対象は都度変更します。
上記いずれの方法にしても、いちいちコピーやプロパティの変更が面倒です。
もし、プロジェクトAで生成された.objファイルを自動でリンクしてくれたら楽チンです。
ソリューションエクスプローラ上で複数のプロジェクトに共有(リンク)されるようにできる登録方法はないでしょうか??
プロジェクトの依存関係を設定(BがAに依存)するだけではダメでした。
0910デフォルトの名無しさん2013/04/04(木) 22:13:57.31
>>910
既にあるプロジェクトにリンク指定したいのか
新たに作成されるプロジェクトに初期値としてリンク指定したいのか
どっち?
0911デフォルトの名無しさん2013/04/04(木) 22:44:46.84
プロジェクトC(LIBプロジェクト)を作成し、そこに共有モジュールを登録する。
それが必要なプロジェクトにCへの依存関係を設定する。
09129092013/04/04(木) 22:53:29.64
>>910
前者のほう、既にあるプロジェクト間でのリンクです。

>>911
なるほど、その手がありますね。
明日会社でやってみます。
0913デフォルトの名無しさん2013/04/04(木) 23:00:25.13
その手がってより、王道だけどな。
0914デフォルトの名無しさん2013/04/04(木) 23:30:54.25
dllプロジェクトを作成してビルドする時に.expファイルとかのdll以外のファイルもdllと同じ場所に出力されるのが嫌なので
全般->出力ディレクトリ->
リンカー->全般->出力ファイル->
この2箇所を変更したのですが

warning MSB8012: TargetPath() が Linker の OutputFile プロパティ値 () と一致しません。
このため、プロジェクトが正常にビルドされない可能性があります。
この問題を解決するには、$(OutDir)、$(TargetName)、および $(TargetExt) の各プロパティ値が、%(Link.OutputFile) で指定されている値と一致することを確認してください。

と警告が出てしまいます
dllファイルとexpの出力場所を変更してさらにこの警告が出ないようにするにはどうすればいいですか?
#pragmaの警告無視以外の方法があれば教えてください
0915デフォルトの名無しさん2013/04/05(金) 00:49:02.08
ビルド後イベントに必要なファイルだけをどっか適当なところにコピーするバッチファイルでも仕込む。
0916デフォルトの名無しさん2013/04/05(金) 12:26:57.71
そういう手段しかないのですね
ありがとうございました!
09179092013/04/05(金) 20:19:11.56
>>911
できました!
理想通りです!
ありがとうございました!

>>913
勉強になりました!
0918デフォルトの名無しさん2013/04/17(水) 20:31:53.57
等高線グラフを表示させたいのですが、
手段が見つかりません。

3D点(x,y,z)の点(データ)×数万個を線で結びつけて、色付けしたものです。

チャートコントロール(mschar)では等高線をサポートしておらず、実現できません。
System::Windows::Forms::DataVisualization::Charting::Chart

どなたかご教授くださいませ!

[環境]
visual c++ 2008 express
vs2012へ更新検討中
0919片山博文MZパンク ◆0lBZNi.Q7evd 2013/04/17(水) 21:00:16.72
>>918
自分で描画したいなら、遠近法で(x/(z+α),y/(z+α))みたいにして奥の方から描画。OpenGLの方が簡単で無難。
0920片山博文MZパンク ◆0lBZNi.Q7evd 2013/04/17(水) 21:25:28.09
ピクチャコントロールのウィンドウハンドルを取得。
自前で描画する場合はウィンドウのDCを取得。
OpenGLで描画する場合はウィンドウにピクセルフォーマットを設定。
0921デフォルトの名無しさん2013/04/17(水) 23:17:56.11
>>919
>>920
書き込みありがとうございます。
遠近法、自前で描写、…難しそうです

変数->ADD(xの値,yの値,zの値);
変数->全ての点を線で結ぶ;
変数->zの値を元に色付けする;

っていうレベルで考えてます
OpenGLとかDirectXなら可能でしょうか?
0922デフォルトの名無しさん2013/04/17(水) 23:21:27.31
>>919
>>920
追加で…

ググってみたところ、Microsoft.Office.Tools.Excel.Char でグラフを作成できるのかな、
と思いました。(Excelだと等高線グラフを簡単に作成できるため)

Microsoft.Office.Tools.Excel.Charは何をするためにあるものでしょうか?
望みのことができますか?
できるなら、どのように導入(参照設定やら名前空間やらツールボックスやら)できますか?
0923デフォルトの名無しさん2013/04/17(水) 23:24:46.61
マルチ
0924デフォルトの名無しさん2013/04/17(水) 23:42:53.85
>>918
Mathematica使う
0925片山博文MZパンク ◆0lBZNi.Q7evd 2013/04/18(木) 00:03:54.18
ヒント:OLE
0926片山博文MZパンク ◆0lBZNi.Q7evd 2013/04/18(木) 00:24:38.33
本当にVC++でやりたいの?

初心者ならEXCELのVBAでやるのが一番楽
0927デフォルトの名無しさん2013/05/12(日) 02:37:22.35
一番楽 キリッ

言い切るならコードを示してみろよ
0928デフォルトの名無しさん2013/05/17(金) 23:02:29.59
>>927
ホイ
http://stat.ameba.jp/user_images/20111009/17/wwww0628/e9/e6/j/o0350034511535747985.jpg
0929デフォルトの名無しさん2013/05/18(土) 11:06:55.10
ここは初心者にURLの貼り方を教えるスレではない
0930デフォルトの名無しさん2013/05/20(月) 20:49:35.79
windows上で,読み書きの両方ができる_popen()の拡張を作るにはどうしたらいいだろうか。
_popen()で開いた子プロセスに対して,コマンドを投げて,その結果をもらって,また次のコマンドを投げて・・・
ということをやりたい。

条件として,子プロセスに対して,改変を加えるのはなしの方向で。

Linux上ではできるみたいだが,Windows上ではできるのだろうか。
どなたか教えてください。
[環境]
Visual C++ 2010
Windows 7/8
0931デフォルトの名無しさん2013/05/20(月) 21:12:17.37
DialogBoxを、リソースファイルなしで、プログラムから動的にデザイン(サイズ、コントロールの追加など)することは
可能でしょうか?
その場合、参考となるAPIを1つでいいので教えてください。
(それをもとに検索して他にも色々調べます)
0932デフォルトの名無しさん2013/05/20(月) 21:17:12.10
「動的ダイアログ作成 vc」で検索
09339312013/05/20(月) 21:32:37.16
>>932
ありがとうございました。
0934片山博文MZパンク ◆0lBZNi.Q7evd 2013/05/20(月) 23:48:16.04
>>930
CreateProcessとパイプ
09359302013/05/24(金) 08:41:11.60
>>934

大変遅くなりましたが,ありがとうございます。
キーワードを元にがんばってみます。
0936デフォルトの名無しさん2013/05/24(金) 09:53:35.87
VC2008で AfxMessageBox()でコンパイル出来ない
0937デフォルトの名無しさん2013/05/24(金) 12:30:27.48
Express ってオチか?
09389362013/05/24(金) 15:02:37.67
あれ 出来そうな感じね。
久々にVCいじってみたら綺麗に忘れてる。
なんか勘違いしてるのかも。
0939デフォルトの名無しさん2013/05/24(金) 17:08:04.50
AfxMessageBoxはMFCの関数。プロジェクトはMFCサポートしてるか?
09409362013/05/24(金) 22:10:48.74
>>939
あう チェックしてるみます。 でもそれっぽい ハジー
0941デフォルトの名無しさん2013/05/26(日) 04:59:13.13
2010のExpressについて質問です

1,
TODOコメントを入れる時に日付とか名前を自動で入れられるようにできないですか?
要するにTODOコメントのテンプレを作りたいってことです

2,
switchとかclass(アクセス指定子)とかのインデントを個別に設定出来ませんか?
0942デフォルトの名無しさん2013/05/28(火) 23:26:59.24
Visual C++ 2010 Express - CRLを使用して、部活動分類ツールを作っているのですが
うまくいきません。
苗字とクラスをコンボボックスから選んで、該当する組み合わせがあれば
コピー専用のテキストボックスに所属している部活動名が表示されるプログラムです。
if文を使って処理をしようと思っているのですが、項目の編集で登録した
苗字、クラス名の要素をどうやって取得していいのかわかりません。
どうすれば、AddRange(gcnew cli:: array< System::Object^ >(数値) {}); から要素を取得し、
仕様通りに動くプログラムを作ることができるのでしょうか?

作りかけのプロジェクトを置いておきます。
http://kie.nu/11at
0943デフォルトの名無しさん2013/05/29(水) 01:01:47.38
コード見たけど。
そもそもどうやって、名字とクラスと部活を結びつけようとしてんの? どこにもなさそうなんだが。

簡単な方法としては、上の3つを要素として持つクラスを作成して、その配列に生徒?を登録。
条件を入力されたら、上の配列の名字とクラス名とで照らし合わせて一致してれば
その同じ要素にある部活名を表示でいいんじゃね。

検索の方法は、for ループで配列をまわして if でチェックでもいいし、LINQ が使えるならそれ使ってもいいし。



あと、ここで言うのもなんだが。その内容なら C# でやった方が。。。
0944デフォルトの名無しさん2013/05/29(水) 21:16:22.37
C++を始めて間もないのですが教えてください。

_tmainのコンソールアプリのプロジェクトでMFCのクラスを使いたいのですが、

この場合はどのようにするのでしょうか?MFCのアプリだと派生クラスで定義しているのは

参考にしているプロジェクトで分かるのですが、コンソールアプリだとどうしたらよいのでしょうか
0945デフォルトの名無しさん2013/05/29(水) 21:18:34.59
プロジェクト作るときにMFCにチェック
0946デフォルトの名無しさん2013/05/29(水) 21:36:39.30
>>945
すみません説明不足でした。

参考にしているMFCアプリのソースがありまして、それは派生クラスを使って、外部のクラスを呼び出しているところまでは分かりました。

コンソールアプリでMFCのチェックを入れれば、とりあえず、同じ外部のクラスを読み込ませることはできたのですが、

読み込ませただけで、どのようにしたら使えるようになるのかがわかりません。

_tmainの場合とMFCの派生させて使う場合の使いわけが、混乱しています。
0947デフォルトの名無しさん2013/05/29(水) 21:45:41.87
MFCを利用してるサードパーティ製のクラスの利用方法が聞きたいってことか。
それはエスパーじゃないと答えれないな
0948デフォルトの名無しさん2013/05/30(木) 08:33:58.88
AfxWinInit関係を調べます。
0949デフォルトの名無しさん2013/06/08(土) 21:21:20.98
VC++ 2008 の win32 console(マルチバイト文字セットを使用する)
にて下記のようにエラーが出力されます。
----
0xC0000005: 場所 0xcdcdcdc9 を読み込み中にアクセス違反が発生しました。
0xC0000005: 場所 0xcdcdcdc9 を読み込み中にアクセス違反が発生しました。
プログラム '[15796] test.exe: ネイティブ' はコード -1073741819 (0xc0000005) で終了しました。
----
▽▽▽ ソース
#include <stdio.h>
#include <atlstr.h>

int main(int argc, char* argv[])
{
  CString *pstr;

  pstr = (CString *)malloc(sizeof(CString) * 2);

  pstr[0].Format("test0");
  pstr[1].Format("test1");

  printf("%s\n", (char *)(LPCTSTR)pstr[0]);
  printf("%s\n", (char *)(LPCTSTR)pstr[1]);

  free(pstr);

  return 0;
}
△△△
CString型配列を動的に確保する方法がありましたら、
ご教示お願いします。
0950デフォルトの名無しさん2013/06/08(土) 22:33:19.81
× pstr = (CString *)malloc(sizeof(CString) * 2);
○ pstr = new CString[2];

× pstr[0].Format("test0");
○ pstr[0].Format(_T("test0"));

×printf("%s\n", (char *)(LPCTSTR)pstr[0]);
○printf("%s\n", (CStringA)pstr[0]);

× free(pstr);
○ delete[] pstr;
0951デフォルトの名無しさん2013/06/09(日) 02:05:10.00
>>950
丁寧に教えていただきありがとうございます
0952デフォルトの名無しさん2013/06/09(日) 02:59:48.98
01: #include <stdio.h>
02: #include <atlstr.h>
03: #include <vector>
04: 
05: int main(int argc, char* argv[])
06: {
07:   std::vector<CStringA> vstr;
08:   int bk_cnt, cnt = 0;
09: 
10:   bk_cnt = cnt;
11:   vstr.resize(cnt + 1);
12:   if( bk_cnt == vstr.size() ) return 0; // メモリ再割り当て失敗の場合は終了する
13: printf("bk_cnt=[%d] size=[%d]\n", bk_cnt, vstr.size());
14:   vstr[ cnt++ ].Format("あああ");
15: printf("vstr[%d]=[%s]\n", bk_cnt, vstr[bk_cnt]);
16: 
17:   bk_cnt = cnt;
18:   vstr.resize(cnt + 1);
19:   if( bk_cnt == vstr.size() ) return 0; // メモリ再割り当て失敗の場合は終了する
20: printf("bk_cnt=[%d] size=[%d]\n", bk_cnt, vstr.size());
21:   vstr[ cnt++ ].Format("いいい");
22: printf("vstr[%d]=[%s]\n", bk_cnt, vstr[bk_cnt]);
23: 
24:   return 0;
25: }
26: ----【実行結果】----
27: bk_cnt=[0] size=[1]
28: vstr[0]=[あああ]
29: bk_cnt=[1] size=[2]
30: vstr[1]=[いいい]
0953デフォルトの名無しさん2013/06/09(日) 03:02:33.22
見にくいソースで申し訳ないのですが、
>>952について教えて欲しいです。
VC++ 2008 の win32 console(マルチバイト文字セットを使用する)環境で実行しました。

std::vector を使い CStringA型の配列のメモリを動的に再割り当てするプログラムです。
vector::resize の成功か失敗かを知りたいのですが、この関数はvoid型なので、
戻り値がありません。

10行目、12行目にて、メモリの再割り当てが成功か失敗か判断しているつもりですが、
「成功(要素数が増加している)、失敗(要素数に変化なし)」という判断方法で、
合っていますでしょうか。

ご存じの方がいらっしゃれば、よろしくお願いします。
0954デフォルトの名無しさん2013/06/09(日) 03:07:29.31
例外知らないとかお前なにを勉強してたんだ
0955デフォルトの名無しさん2013/06/09(日) 03:18:48.52
>>954
すみません。あまり慣れていない手段(例外)は使いたくなかったので避けていました
>>952では失敗を検知するのは例外(try , throw , catch)を使う方法しかないのでしょうか
0956デフォルトの名無しさん2013/06/09(日) 03:24:07.71
ない
0957デフォルトの名無しさん2013/06/09(日) 07:43:53.94
>>956
ありがとうございます
了解しました
0958デフォルトの名無しさん2013/08/06(火) NY:AN:NY.AN
教えてください
0959片山博文MZパンク ◆0lBZNi.Q7evd 2013/08/06(火) NY:AN:NY.AN
>>958
インストールハ、オワッタカ?
0960デフォルトの名無しさん2013/08/06(火) NY:AN:NY.AN
お断りします
0961デフォルトの名無しさん2013/08/07(水) NY:AN:NY.AN
ひどいわ
0962デフォルトの名無しさん2013/08/08(木) NY:AN:NY.AN
Visual c++でCを使う方法を教えて下さい。基本情報受けたいです。
0963デフォルトの名無しさん2013/08/08(木) NY:AN:NY.AN
ファイル拡張子をCにしたら?
0964デフォルトの名無しさん2013/08/08(木) NY:AN:NY.AN
ありがとうございます、普通にフォルダで見るとCのファイルに変わってるんですが、VisualC++ を開いた時、左側のソリューションのところでは画像がC++のファイルのままです。これは変わってるんですか?
0965デフォルトの名無しさん2013/08/08(木) NY:AN:NY.AN
よく分からんが変わってるんじゃない?
CもC++も同じだから気にするな
0966デフォルトの名無しさん2013/08/08(木) NY:AN:NY.AN
こんな感じ?
http://tinqwill.blog59.fc2.com/blog-entry-68.html
0967デフォルトの名無しさん2013/08/08(木) NY:AN:NY.AN
ファイルの拡張子を表示する設定にしてないとか
0968デフォルトの名無しさん2013/08/08(木) NY:AN:NY.AN
>基本情報受けたい

って意味がよく分からん
0969デフォルトの名無しさん2013/08/08(木) NY:AN:NY.AN
試験勉強に使いたいって意味だろ気にすんな
0970デフォルトの名無しさん2013/08/09(金) NY:AN:NY.AN
VC使ってのに未だにfreadとか平気使う
私もいますよ。
0971デフォルトの名無しさん2013/08/09(金) NY:AN:NY.AN
つうか何でもぶちんで動けばいいやって考えはやばいですか
0972デフォルトの名無しさん2013/08/09(金) NY:AN:NY.AN
仕事じゃなきゃそれがいいよ
書かない、動かないのほうがやばい
0973デフォルトの名無しさん2013/08/10(土) NY:AN:NY.AN
Cのアパコンパチなんでコンパイル、リンクが出来て
テストパスすればいんでしょうけど、
やぱC++のfstreamとかiosとかでやりたいってのはあるよねぇ。
0974デフォルトの名無しさん2013/08/11(日) NY:AN:NY.AN
2ヶ月空いてるのに食いつき方きめえな
特におまえは>>959シコシココード書いてろ
0975デフォルトの名無しさん2013/08/11(日) NY:AN:NY.AN
こいつこそ、5 日も空けてから入れるツッコミじゃないと思うが。
0976デフォルトの名無しさん2013/08/12(月) NY:AN:NY.AN
誰が誰だか
0977デフォルトの名無しさん2013/08/12(月) NY:AN:NY.AN
まあまあ
0978デフォルトの名無しさん2013/08/28(水) NY:AN:NY.AN
野良関数はどこのファイルに書いていいのですか?
mainだけ?
ほかのクラスの.cppに適当に放り込んでもいいのですか?
0979デフォルトの名無しさん2013/08/28(水) NY:AN:NY.AN
どこでもいいけど
後で困らないように分けといたら?
0980デフォルトの名無しさん2013/08/28(水) NY:AN:NY.AN
ありがとうございます
コードは書いてあっても
ファイル分けまで説明してない本が多くて
基礎を読んだ後いざ作ろうとするとよくわからなくなってしまいました

>ほかのクラスの.cppに適当に放り込んでもいいのですか?
これはクラスのメンバ関数とは別にそのまま呼び出せるのでしょうか
0981デフォルトの名無しさん2013/08/28(水) NY:AN:NY.AN
そのまま呼び出せなきゃ困るだろ
0982デフォルトの名無しさん2013/08/28(水) NY:AN:NY.AN
はい
わかりました
0983デフォルトの名無しさん2013/08/28(水) NY:AN:NY.AN
そこからか。
プロトタイプ宣言をヘッダにまとめて、使いたいとこでinclude
そのファイルでしか使わないなら、上の方にプロトタイプ宣言書けばいい。
関数定義を上に持っていく、というものぐさはあとで困るかもw
0984デフォルトの名無しさん2013/08/28(水) NY:AN:NY.AN
俺は野良関数でも野放しにしないで、野良関数用のclass作っておくな
0985デフォルトの名無しさん2013/08/28(水) NY:AN:NY.AN
ためしにでたらめなものでやってみましたが
そのプロトタイプ宣言は
ヘッダにも書けるし
mainにも書けるのですね
せっかく別ファイルに書いたのにmainに書いていては意味無いですが
0986デフォルトの名無しさん2013/08/28(水) NY:AN:NY.AN
あ
レス数が950を超えています。1000を超えると書き込みができなくなります。