ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

VC++を極める会?コミュのVC++質問トピ【その2】

  • mixiチェック
  • このエントリーをはてなブックマークに追加
Microsoft Visual C++ に関する質問トピック(2)です。

新規トピックを立てるまでもない質問に関してはこちらをお使いください。

コメント(141)

□ 質問「コンソールアプリが出力する文字列を取得するには?」 □

MFCアプリからコンソールアプリを実行して、そのコンソールアプリが吐き出す文字列を取得するにはどうすればいいでしょうか?

具体的には、Flex SDK(Flashに書き出せるSDK)の中のコンパイラを実行して、成功したらすぐにコンパイルできたプログラムを実行できたらと考えています。

Visual Studio 2008 Professional
Windows 7 Home Premium
このへんかな?
http://support.microsoft.com/kb/190351/ja
[103]のぐーさん、ありがとうございます。

でもソースがビルドエラーを引き起こします・・・。
そのソースは、redirect.c (呼び出し側)とchild.c (呼び出され側)の二つを別々にビルドしないといけません。そこは大丈夫でしょうか?
[103]のぐーさん、ありがとうございます。

それはわかっています。
Child.cだけはコンソールアプリとして動くみたいでした。
でもRedirect.cはビルドエラーが出ます。
ではそのエラーはコンパイル時のエラーかリンク時のエラーか。コンパイル時のエラーだったらどの行でエラーになってるかコンパイラが教えてくれるはず。
わからなければ、エラーメッセージをそのまま転記してください。
[107]のぐーさん、ありがとうございます。

エラー 1 error C2664: 'CreateProcessW' : 2 番目の引数を 'const char [10]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照) c:\users\takeshi\documents\visual studio 2008\projects\tools\redirect\redirect\redirect.cpp 167
エラー 2 error C2664: 'wsprintfW' : 1 番目の引数を 'CHAR [512]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照) c:\users\takeshi\documents\visual studio 2008\projects\tools\redirect\redirect\redirect.cpp 260
エラー 3 error C2664: 'lstrlenW' : 1 番目の引数を 'CHAR [512]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) c:\users\takeshi\documents\visual studio 2008\projects\tools\redirect\redirect\redirect.cpp 263

どうすればいいでしょう?
1)メニューから「プロジェクト」→「プロパティ」を選ぶ(もしくは「ソリューション」ウィンドウにあるプロジェクトを右クリックしてプロパティを選んでも良い)

2)「プロパティページ」ダイアログが開くので、「構成(C)」を「すべての構成」に変更、左の「構成プロパティ」→「全般」をクリック。

3)右の「プロジェクトの規定値」の中の「文字セット」を「マルチバイト文字セットを使用する」に変更して「OK」

4)再ビルド

(細かい部分は違うかもしれません。私のはProfessional版ではないので。)
[109]のぐーさん、ありがとうございます。

実行は出来たのですが、Child.exeが起動して、Redirect.exeに「exit」と入力して終了することしかできません。
それで良いのです。ソース上でデータの流れを確認してください。

>質問「コンソールアプリが出力する文字列を取得するには?」

Redirect.exeに対してEXITと入力すると、
「Child echoing [EXIT]」と出力すると思います。
この文字列を出力しているのはchild.exeです。
それをRedirect.exeが「取得」して表示しています。
[111]のぐーさん、ありがとうございます。

なるほど。

手取り足取り教えていただき、ありがとうございました。
初めまして。
CSVファイルを読み込み、DateGridViewに表示させたいのですが、どうすればいいのかわかりません。
開発環境はvisualStudio2010 .NET FreamWork C++/CLIで課題を作成しています。
テキストファイルの読み込み、書き込みだとFileStreamを使ってできています。

初心者で知識もないので、どなたか教えていただけたらと思いますので、よろしくお願いします。
>>116
どこまでできてて何がわからないのかわからないと何もアドバイスがしようがないです。
□ 質問「CRichEditViewでhtmlタグのように」 □

MFCのCRichEditViewでHTMLのタグのようにシンプルにフォントサイズや文字色を指定するにはどうすればいいでしょうか?

どうせならCHtmlViewを使う手もありますが、たくさんのhtmlファイルを用意するのはまずいので、シリアライズした1ファイルに複数のページを保存したいのです。

Visual Studio 2008 Professional
Windows7 Home Premium
アドバイスお願いします。
Visual Studio 2008 c++でドル円変換のプラグラムを作りたいのですがよくわかりません。
仕様はedit boxを2つ、ボタンを2つ用意します。
例えばedit box1に「\1000」または「$1000」と入力し、「\」、「$」のボタンを押すと、edit box2に入力していたレート金額で計算し、edit box1に記号付き「\」
「$」で結果を表示します。*小数点以下2桁まで対応
注)$ボタン、\ボタンが押されたときに呼ばれるメソッド(関数)の中で、金額を計算するのではなく、金額を計算するメソッド(関数)を別に作り、1つのメソッドで&変換、\変換を行うようにすること。
お願いします(><)
>>119

練習として自分なりに作ってみた。
「アドバイスお願いします。 」といってもどこをアドバイスして欲しいのか書いていないから全部書いたよ。

https://sites.google.com/site/cpagelinks/monooki/dollaryenconversion

間違っているところもあるかも知れません。
結果は小数点に対応しているけど、レート入力はしてないです。
Visual C++ 6.0 SE(SP6)で視覚的にC++のプログラムを組めるツールを作っているのですが、

http://jester.dw.land.to/download.htm

これから先どう作ろうか迷っています。
インストーラ付きアプリとプロジェクトのフォルダ(圧縮したもの)がこのページにあるので出来れば見てもらえないでしょうか。
cpageさんのソースコードで疑問になったので質問させてください。
レート計算をTCHARポインタパラメータそのまま算出値として使用されていますが
パラメータが例えば「_T("1")」の文字列を数値にすると
WCHAR型の場合「0x3100」になると思われますがあっていますでしょうか。

ちょっとソースコードを見ていて気になりましたので質問させて頂きました。
上記の質問自己解決です。
ちゃんと見てなくてすみません。

メモリー領域だけ見てました。
正しくはWCHAR型の場合「0x0031」でTEXT('0')「0x0030」
によって相殺して数値にしてますね。
失礼しました。
はじめまして。
 VC++2010Expressで、Word2010 を起動するサンプルを試しました。
http://www.itlab51.com/?p=4470

 じっさいには、VC++開発環境のあるPCにはWORD2003が入っていてWORD2010はないので、
Microsoft Word 14.0 Object Libraryではなくて、
プロパティページから参照の追加、COMタブから、Microsoft Word 11.0 Object Libraryを追加しました。

しかし、次のようにコンパイルエラーになります。

#pragma once
// 名前空間の追加
 using namespace WD=Microsoft::Office::Interop::Word;

>e:\vc++\10\word\word\Form1.h(3): error C2143: 構文エラー : ';' が '=' の前にありません。
1>e:\vc++\10\word\word\Form1.h(3): error C2871: 'WD' : この名前を指定された名前空間は存在しません。
1>e:\vc++\10\word\word\Form1.h(3): error C2513: 'int' : 指定された型は、識別子の名前を指定せずに宣言されています。
1>e:\vc++\10\word\word\Form1.h(3): error C3083: 'Office': '::' の左側のシンボルには、型を指定しなければなりません
1>e:\vc++\10\word\word\Form1.h(3): error C3083: 'Interop': '::' の左側のシンボルには、型を指定しなければなりません
1>e:\vc++\10\word\word\Form1.h(3): error C2039: 'Word' : 'Microsoft' のメンバーではありません。

行頭にセミコロンを付けてもエラーです。

 何がエラーの原因でしょうか.。よろしくお願いいたします。
>>127

using namespace WD=Microsoft::Office::Interop::Word; ではなく、
namespace WD=Microsoft::Office::Interop::Word; ならいけると思います。

using を削除して試してみてください。


ちなみにexeファイルを起動するなら以下のような書き方でもできます。
この場合メモ帳を起動します。やり方は他にもあります。

#include <Windows.h>

int main() {
ShellExecuteA(NULL, NULL, "notepad.exe", NULL, NULL, SW_SHOWNORMAL);
return 0;
}
> 128 cpageさん、ありがとうございます。

 試してみます。
>> 129

usingを削除しましたが、別のエラーになりました。
参照は、参照の追加、COMタブから、Microsoft Word 12.0 Object Libraryを追加しています。
名前空間の順序が添付図とサンプルとでは異なるのでしょうか。

// 名前空間の追加
namespace WD=Microsoft::Office::Interop::Word;// sampleから usingを削除


1> word.cpp
1>e:\vc++\10\word\word\Form1.h(14): error C3083: 'Interop': '::' の左側のシンボルには、型を指定しなければなりません
1>e:\vc++\10\word\word\Form1.h(14): error C2039: 'Word' : 'Microsoft::Office' のメンバーではありません。
ねぇ、なんでさぁ名前空間の前にWD=って、それは何のために必要なの?
>> 131 ごーやーまんさん、おはようございます。

 毎回、Microsoft::Office::Interop::Word:: と書くより、WD::のほうが楽だからだと思います。WordとExcel名前空間を区別するためには、次のようにしてもよさそうです。


using namespace Microsoft::Office::Interop; // ::Word;// sampleからWD=を削除

関数内(){

Word::Application^ wdApp = gcnew Word::Application();
}
しかし、using namespaceの行でエラーです。

1>e:\vc++\10\word\word\Form1.h(14): error C2039: 'Interop' : 'Microsoft::Office' のメンバーではありません。
1>e:\vc++\10\word\word\Form1.h(14): error C2871: 'Interop' : この名前を指定された名前空間は存在しません。
1>e:\vc++\10\word\word\Form1.h(82): error C2653: 'Word' : 識別子がクラス名でも名前空間名でもありません。
1>e:\vc++\10\word\word\Form1.h(82): error C2653: 'Word' : 識別子がクラス名でも名前空間名でもありません。
1>e:\vc++\10\word\word\Form1.h(82): error C3767: 'System::Windows::Forms::Application::Application': 候補の関数はアクセス可能ではありません。
1>e:\vc++\10\word\word\Form1.h(83): error C2039: 'Visible' : 'System::Windows::Forms::Application' のメンバーではありません。
>> 128 cpageさん、 おはようございます。
 下記のように、ShellExecuteAを使ってみました。コンパイルはできましたがビルドは失敗しました。ShellExecuteAを含むモジュールをリンクする必要があるのでしょうか。あるいはDLLの利用宣言が抜けていますか。
 環境は、VC++2010 プロジェクトのテンプレートはCLR、 Windowsフォームアプリケーションです。

#include <Windows.h>
・・・

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
ShellExecuteA(NULL,NULL,"winword",NULL,NULL,SW_SHOWNORMAL);

}


1>------ ビルド開始: プロジェクト: word, 構成: Debug Win32 ------
1> word.cpp
1>word.obj : error LNK2028: 未解決のトークン (0A000011) "extern "C" struct HINSTANCE__ * __stdcall ShellExecuteA(struct HWND__ *,char const *,char const *,char const *,char const *,int)" (?ShellExecuteA@@$$J224YGPAUHINSTANCE__@@PAUHWND__@@PBD111H@Z) が関数 "private: void __clrcall word::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@word@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) で参照されました。
1>word.obj : error LNK2019: 未解決の外部シンボル "extern "C" struct HINSTANCE__ * __stdcall ShellExecuteA(struct HWND__ *,char const *,char const *,char const *,char const *,int)" (?ShellExecuteA@@$$J224YGPAUHINSTANCE__@@PAUHWND__@@PBD111H@Z) が関数 "private: void __clrcall word::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@word@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) で参照されました。
1>E:\VC++\10\word\Debug\word.exe : fatal error LNK1120: 外部参照 2 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
>132
そうなの?
そんなこと出来るなんて、いったいどこ見たら出てるんだ?
何でそんなこと知ってるの?

…やっぱり、MSだよなあ、、、
> 134 ごーやーまんさん
 WD=
は、できないのですね?
正しい記述方法、あるいは見るべきドキュメントをご教示いただけませんか。
 .NETの学び方が分からなくて、困っています。

よろしくお願いします。
http://www.cplusplus.com/doc/tutorial/namespaces/
Namespace aliasのところ

http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284351&answer=1046398336
もNamespace Aliasのところ

http://msdn.microsoft.com/ja-jp/library/chwe1tc8%28v=vs.80%29.aspx
> 136 てるさん、ありがとうございます。

namespace aoi = outer::inner;
のように、aliasできるのですね。

つまり、
Microsoft::Office::Interop::Word
という名前空間がないということになります。
includeファイルが不足している? DLLの指定が不足している? その他、なにか間違いがあるのですね。


前回までのあらすじ) この話題の元は、下記のとおり。
 VC++2010Expressで、Word2010 を起動するサンプルを試しました。
http://www.itlab51.com/?p=4470

using namespace WD=Microsoft::Office::Interop::Word;  がエラーになったので、
namespace WD=Microsoft::Office::Interop::Word; ならいけると思います。
ということで試しましたが、

1>e:\vc++\10\word\word\Form1.h(14): error C3083: 'Interop': '::' の左側のシンボルには、型を指定しなければなりません
1>e:\vc++\10\word\word\Form1.h(14): error C2039: 'Word' : 'Microsoft::Office' のメンバーではありません。
というエラーになりました。
>133

C++/CLIは僕の環境では動かせないようで、間違っていたりや非推奨の書き方になるかも知れませんが、、、

ShellExecute はインポートライブラリ shell32.lib を使っているようです。
http://msdn.microsoft.com/ja-jp/library/cc422072.aspx

よって、 #pragma comment(lib,"shell32.lib") とソースファイルのどこかに書けば
エラーは出ないと思います。


また他の方法として
System::Diagnostics::Process::Start(L"winword");
で起動できると思います。

http://msdn.microsoft.com/ja-jp/library/system.diagnostics.process(v=vs.80).aspx

ちなみに↑には #using <System.dll> という書き方があるようですが、
これも何かに使うのかも知れません。
> 138 cpageさん、ありがとうございます。

 それぞれ試してみます。

ShellExecute のlpVerbにeditを与えれば、実行するPC(環境)にあるワードなりワードパッドなりが指定したファイルを開いてくれるのでしょうか。

#pragma commentでライブラリをリンクするのですね。

> 139
 ShellExecute できました。
"edit"を指定すると、第3引数に開きたいファイルを指定して、拡張子によって、txtならメモ帳、docならWORDを開くことができました。
□ 質問「他のアプリにフキダシを出すには?」 □

フキダシだけのアプリを作って、他のアプリの上にフキダシで説明を表示するチュートリアルシステムみたいなのを考えています。

本当にできるなら既にアプリが作られてる気もしますが、別の任意のアプリの特定の場所を取得することはできますか?

モードレスダイアログで全てのアプリの一番手前にフキダシが出せるだけでは駄目で、別のアプリのインターフェースの場所を特定したいです。

できるのでしたら、やり方を教えてください。

ログインすると、残り106件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

VC++を極める会? 更新情報

VC++を極める会?のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング