AIと戦って、あなたの人生のリスク診断 >>

visual C++ 6.0 で作成したプログラムがあります。このソースリストをVisual Studio 2005 Express Edition の Visual C++ 2005 Express Editionでコンパイルしようとしましたが、#include <Windows.h> でエラーになって先に進みません。対応したWindows.hの入手方法教えてください。
それとも、そもそも、Visual C++ 2005 Express Editionでは昔のVC++のプログラムはコンパイルできないのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (5件)

>そこで、ハードディスク内からafxres.h を探したところ2箇所


>SDKの\include\mfc の中と\Samples\NetDS\ADSI\samples\General\DsBrouse\bitmapsの中にありました。両者は異なる内容でどちらを使ってよいのかわかりません。ためしにそれぞれをプロジェクトのディレクトリにコピーしたところ、いずれのafxres.h を使っても、今度は'winres.h'がないと言われます。

PlatformSDKに入っていたンですかね。
winres.hは「SDKの\include\mfc の中」にありませんか?
Visual Studio 2005 Express Editionでインクルードパスを追加したらそのまま行けるかも知れません。
# そこまでExpressEditionで試していませんが。
[ツール]-[オプション]の「プロジェクトおよびソリューション」の「VC++ ディレクトリ」でPlatformSDKのインクルードパスを指定したハズですので、
「include\mfc」も追加してみては?
ライブラリの方で問題が出た場合にはリンク出来ませんが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>「include\mfc」も追加してみては?
やっぱりだめでした。だんだんエラーの数が増えていってます。

Visual C++ 20005 でコンパイルするために、これ以上時間を使うわけにいきませんので、プログラムの再利用をあきらめるか、Visual C++ 6.0 を探し出して、再利用するかの決断をすることにしました。

お礼日時:2007/10/24 19:30

>今度は、'afxres.h'が見つからないというエラーになりました。



確か、VCのリソースエディタが参照するファイルだったかと。
VC6.0のヤツをプロジェクトのディレクトリにコピーしてみたら使えるかも知れません。
試したことはありませんが……

ExpressEditionだとリソースエディタが付属していないので、
結構面倒かと。(探せばフリーのリソースエディタがありますが)

ExpressEditionでも、MSに登録していればアップグレード版が利用可能だったと思います。
2万円前後でStandard版に入れ替えてしまいました。
# 発売2ヶ月前にVC++.Net2003買っていたり。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>VC6.0のヤツをプロジェクトのディレクトリにコピーしてみたら使えるかも知れません。
具体的にどうやるのでしょう?
手元にあるソースリストにはafxres.hというファイルはありません。
そこで、ハードディスク内からafxres.h を探したところ2箇所
SDKの\include\mfc の中と\Samples\NetDS\ADSI\samples\General\DsBrouse\bitmapsの中にありました。両者は異なる内容でどちらを使ってよいのかわかりません。ためしにそれぞれをプロジェクトのディレクトリにコピーしたところ、いずれのafxres.h を使っても、今度は'winres.h'がないと言われます。
VC6.0のafxres.hをどこかで入手しないとだめなのでしょうか?

お礼日時:2007/10/21 20:43

VC2003以降だったVC2005以降だったか忘れたけど。

。。
Windowsアプリケーションを作成する為には、
WindowsSDK(PlatformSDK)が必要です。

VC++6.0で作成したプログラムがMFCまたはATLのアプリケーションの
場合は残念ながらVC2005Express Editionではコンパイルできません
ProfassinalかStanderdを購入する必要があります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>WindowsSDK(PlatformSDK)が必要です。
確かにそうでした。

でも、SDKをインストールしたら、今度は、'afxres.h'が見つからないというエラーになりました。

お礼日時:2007/10/20 00:04

 No.1ですが、過去にこんな質問がありましたよ



「windows.hがincludeされない」
http://oshiete1.goo.ne.jp/qa2877508.html

 確認済みでしたら…。(PlatformSDK絡みだと思うのですが)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>PlatformSDK絡みだと思うのですが
確かにそうでした。
紹介くださった質問ページは「良回答」になっていないので、未解決と思い、よく読みませんでした。

早速、PlatformSDKをインストールして、
http://www.microsoft.com/japan/msdn/vstudio/expr …
に従って、修正を加えましたところ、エラーが代わって、今度は、'afxres.h'が見つからないというエラーになりました。
>ただし、大量のコンパイルエラーに対応する必要があるので、次はあまりやりたくないですね。
おっしゃるように、前途多難ですね。

'afxres.h'をファイル検索したところ、このファイルは MSSDK\Include\mfc の中にあることはわかったのですが、なぜ、見つからないのでしょうか?
なお、上記修正の「手順 3. [オプション] ダイアログ ボックスの [プロジェクトとソリューション] セクションで [Visual C++ フォルダ] を更新」のところで、
* Include ファイル - 「MSSDK\include」
を追加してあるのでちゃんと、windows.h は見つかっています。

お礼日時:2007/10/20 00:02

 可能かと問われれば、私も最近visual C++ 6.0のプロジェクトをVisual C++ 2005(Standard Edition)でコンパイルできるように修正しました。



 ただし、大量のコンパイルエラーに対応する必要があるので、次はあまりやりたくないですね。

 取敢えず、私は、#include <Windows.h>を出なかったのですが、開発環境のパス設定は大丈夫ですか?
 エラーメッセージでは何と言っていますか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qwindows.hがincludeされない

http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/を見ながら何度も試したのですがどうしてもwindows.hがインクルードされません。上記のページに書いてあること以外に必要な作業があるのでしょうか?

Aベストアンサー

回答見る限り、パスが設定されてないっぽいですね。

具体的には
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/
の手順3です。

VC++ 2005のメニューから、
ツール → オプション → プロジェクトおよびソリューション → VC++ ディレクトリ
で、
ディレクトリを表示するプロジェクト→
・実行可能ファイル
・インクルードファイル
・ライブラリファイル
の3つの場所にそれぞれ手順3に書かれたパスを追加します。

インクルードファイルの項に追加したパスが、windows.hのある場所なので、これで大丈夫だと思います。
自分もここでつまずいたので…

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QVC++から引数付きexeファイルの実行

タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか?
exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。
出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。
開発環境はVisualStudio2005です。

Aベストアンサー

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
printf("ARGV[%d]=%s\n",i,argv[i]);
}
return 0;
}
以下、実行結果です。
コマンドプロンプト画面に下記の文字が出力されます。
------------------------
system試験開始
ARGV[0]=C:\VCSTUDY\printarg\Debug\printarg.exe
ARGV[1]=XXX
ARGV[2]=YYY
ARGV[3]=ZZZ
system成功
Press any key to continue
---------------------------

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
p...続きを読む

QLPCWSTRとchar

質問なのです・・・

現在、私は[Visual Stdio.Net 2005]を使って、C++のプログラミングをしようと思いまして、今日参考書を見てやってみたのですが、

charの配列を使って、文字列を格納しそれを使おうとしたら、LPCWSTRのキャストが必要というエラーがでました。
参考書だと普通に通るらしいのですが・・・Visual Stdio.Net 2003と2005の違いなのでしょか?わかる方教えていただけませんでしょうか??

Aベストアンサー

補足です。
2005デフォルトのUNICODEを変更する方法は
プロジェクト->プロパティ->構成プロパティ->全般 の中にある
文字セットを[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する]
に変更することで可能です。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qアプリケーション終了時例外エラー(アクセス違反)の調査方法について

大変困っています。

アプリケーションが終了するときに「アクセス違反」がワトソン博士によって取得されています。
当方アプリケーションなどに弱く、解決策の想像が付きません。どなたかご教授お願いいたします。

<解決策例>
・どういったスキルを持った人にどの様な調査を進めさせれば良いのか。。。
・以前同様な事があり原因は○○だった
・恐らく○○だろう
 など、お願いいたします。

<ユーザ報告>
処理終了し、画面が消えたところでワトソン博士のメッセージが表示された

<ログ抜粋>
例外番号c0000005(アクセス違反)

ファンクション:RtlDestroyHeap
~略~
フォールト → 77f6d672 8908 mov [eax],ecx ds:09000001=00000000

<備考>
開発環境:MSVC6.0
動作環境:Windows NT4.0 SP6a
発生頻度:2回/年
使用頻度:2~3回/(平日)

以上、よろしくお願いします。

Aベストアンサー

発生頻度が年2回というのはなかなか厳しい条件ですね。

さて・・・

「私であれば、次の手順で調査を行います。」という書き始めで延々とデバッグ方法を書いていたのですが、書き終わってからちょっとGoogleで検索したら、ひょっとするとちょうど質問者さんのトラブルと同じかもしれない現象がMicrosoftのKBにありました。

場所はここです: http://support.microsoft.com/kb/168006/ja

要点をかいつまんで書くと、MSVCRT/MFCのDLLのバージョン不整合でエラーが発生することがある、という内容です。KB自体は特定のアプリケーションについて書かれていますが、記述されている現象と原因の関係から考えるに、他のアプリケーションでも同様の現象が発生すると思われます。

さてさて。

せっかく書いた文章を捨てるのがもったいないので(貧乏性)、邪魔かもしれませんが下に続けることにします。もし上のKBの内容がそれらしいようであれば、読み飛ばしてください。

========

私であれば、次の手順で調査を行います。

1. MAPファイル、CODファイル作成

「ワトソン博士のログを取得した際に実行していたEXEファイル」をビルドした際、一緒にMAPファイルやCODファイル(リスティングファイル)を作成していれば、そのファイルを用意しておきます。

もし作成していない場合は、「ワトソン博士のログを取得したEXEファイル」と、バイナリレベルで全く同じEXEファイル(バイト単位で比較すると、ファイルに埋め込まれたタイムスタンプ・チェックサム以外は一致する)が作成可能かどうか調べます。(ビルドに必要なソースファイルやビルドオプションに変更を加えていなければ作成可能です。)

作成可能であれば、コンパイルオプションに「リスティングファイルタイプ:マシン語コードとソースを含む」、リンクオプションに「MAPファイル作成」を追加してEXEを再作成してください。これで、「ワトソン博士のログを取得した際に実行していたEXEファイル」に対応するMAPファイルとCODファイルが得られます。

2. エラー発生行を特定

ワトソン博士のログがどれだけ取れているかにもよりますが、スタックダンプが含まれていればたいていエラー発生行を特定できます。

まず「フォールト->」が含まれる逆アセンブルリストを探します。次に、その下にある「スタックバックトレース」を探します。

スタックバックトレースを上から下に順にたどっていくと、そのうち「ReturnAd」(リターンアドレス)がアプリケーションのアドレス範囲(VC++6の標準オプション設定を変更していなければ0x00400000~)に入るところが出てきます。見つかったら、そのアドレスの直前にあるcall命令が例外を発生させたAPIを直接呼び出している場所です。

さて、仮にリターンアドレスが0x00401234だったとします。そうしたら、次はMAPファイルを見てこのアドレスがどの関数に属しているか探します。ちょうど0x00401234というアドレスは見つからないでしょうけれども、これに近いアドレスは見つかるはずです。そのアドレスに対応する関数名もMAPファイルにあります。

次はその関数名をCODファイルから探します。見つかったら、MAPファイルにあるアドレスがCODファイルにあるマシン語コードの先頭アドレスになるので、そこからリターンアドレス0x00401234に対応するはずの場所まで順番にアドレスを辿っていきます。関数の先頭アドレスが0x00401200であれば、0x34バイト先を探すわけです。

そうすると、その探した場所にある命令の直前の命令がcall命令になっているはずです。CODファイルには、その場所のC++ソースでの行番号とソース文もコメントとして入っているはずなので、あとは対応するソースをよーく見てエラーの見当をつけてください。

アセンブラの知識があれば、そこでcallを使った(他の関数を呼び出した)ときの引数の内容もある程度分かります。(ポインタ渡しだと、そのポインタの先の内容までは分かりませんが。)

3. 置き換え用EXEファイルと対応するMAPファイル作成

これ以降は将来への備えです。

コンパイルオプションでデバッグ情報を「プログラムデータベースを使用」、リスティングファイルタイプを「マシン語コードとソースを含む」、リンクオプションで「MAPファイルを作成する」、デバッグ情報「他の種類」を追加してビルドし、出来たEXEファイルを本番用として使用します。同時に作成されるMAPファイル、CODファイル、PDBファイルは保管しておきます。

MAPファイル、CODファイルの使い方は上記2.のとおりです。PDBファイルは、もし完全なクラッシュダンプが取得できればWinDbgを使って事後ソースレベルデバッグが可能になりデバッグ作業が非常に楽になるので、念のため取っておきます。

4. ワトソン博士のオプション変更

drwtsn32.exeを起動し、「クラッシュダンプファイルの作成」をチェックします。(デフォルトは、チェックが入っています。)

クラッシュダンプファイルとEXEとPDBがあればWinDbgで事後ソースレベルデバッグができます。(いわゆるポストモーテムデバッグです。UNIX系でコアダンプしたコアをデバッガで読み込んでデバッグするのと同じ種類のものです。)


普段何とも思わずに行っていることでも、文章にすると長いですね・・・

えーと、「どういうスキルを持った人に調査させればいいか」については、上記の内容を読んで『なるほど!』と言える人でしょうか。

参考URL:http://support.microsoft.com/kb/168006/ja

発生頻度が年2回というのはなかなか厳しい条件ですね。

さて・・・

「私であれば、次の手順で調査を行います。」という書き始めで延々とデバッグ方法を書いていたのですが、書き終わってからちょっとGoogleで検索したら、ひょっとするとちょうど質問者さんのトラブルと同じかもしれない現象がMicrosoftのKBにありました。

場所はここです: http://support.microsoft.com/kb/168006/ja

要点をかいつまんで書くと、MSVCRT/MFCのDLLのバージョン不整合でエラーが発生することがある、という内容です。KB...続きを読む

Q外部依存関係について

外部依存関係に追加する場合について
お教えください。
外部依存関係フォルダに既存ヘッダファイルを
追加するにはどの様にすればよろしいのでしょうか。
申し訳ございませんがお教えください。
eMbedded VC++ 4.0で開発しております。

宜しくお願いいたします。

Aベストアンサー

 こんばんは。

 +Source Files
 +Header Files
 +Resource Files
 +外部依存関係 ←ココに追加したいと言う事でしょうか? 

 ヘッダをインクルードすると追加されます。中には追加されない場合もある見たいなのですが、其の理由迄はチョッと分かりません。
 此方が確認で使用したのは、MSVC++6.0です(恐らく此の部分に関しては、違いが無いと思う)。

Qリソースファイルとは・・・

リソースについて、2つ疑問が沸きました。
もしよろしかったら、アドバイスよろしくお願い致します。

(1)最近まで、Visual C# .NETを使用しておりました。
さきほど、Visual C++ .NETをいろいろいじっていたのですが、C++にはリソースというフォルダがあって、C#にはないのか疑問になりました。

どうしてC++では、リソースとして明確に分けているのかどうしてもわかりません。(そういえば、C#では、多言語に対応できないのかな・・・!?)

(2)C#では、たとえば、メニューのキャプションを変更したりといったことは、コードと同じように編集できるのに、どうしてC++では、わざわざリソースエディタのメニューデザイナで編集させているのでしょうか?

あと、リソースエディタの中にダイアログと言う項目があるのも不思議でなりません。ダイアログもフォームなのにリソースなんでしょうか?(リソースファイルとして保存して何か意味あるのでしょうか?)

Aベストアンサー

リソースには、言語指定が可能で、例えばエラーメッセージの
ような文字列の定義に日本語と英語の両方を記述できます。
で、やったことはありませんが、起動OSにより対応する
リソースが使われます。
このような多言語アプリケーションをリソースを使わずに
作ろうとすると、例えばプログラムの中に複数の文字列を
記述することになりますが、この煩雑さから解放されます。
ダイアログにも項目名が使われますから、言語に依存して
います。
また、リソースを編集するツールを使えば、英語アプリを
日本語に変更することも可能です。
言語だけでなく、プログラム・コードに影響がなければ
他の要素(例えば、アイコン)も変えられます。
但し、著作権が絡むものは、他人には渡せない制限が付きます。

Q外部exe呼び出しの方法 ShellExecuteEx, System...

VC++6での質問す。
◆やりたいこと◆
(1)内部から外部exeを引数ありで呼び出し、処理をさせます。
(2)その外部exeの結果コードを内部的に受け取り、エラー処理させます。
(3)外部exeの処理実行中は、できればDOS窓を非表示にさせます。

system()呼び出しは最も簡単なのですが、(3)が上手くできませんでした。

◆やってみた方法◆
こちらの過去質問も参考に見よう見まねでShellExecuteExを使ってやってみようとしました。

SHELLEXECUTEINFO sei;
DWORDdwRC;
LPVOID msg;
BOOLres;

ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.nShow = SW_HIDE;
sei.lpVerb = (LPCTSTR)cmd;// cmdの中は、"hoge.exe param1 param2"

res=ShellExecuteEx( &sei );

WaitForSingleObject( sei.hProcess, INFINITE );
GetExitCodeProcess( sei.hProcess, &dwRC );
CloseHandle(sei.hProcess);

if(res != FALSE){
MessageBox( "OK", "result", MB_OK );
}else{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwRC,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &msg,
0,
NULL
);
MessageBox( msg, "result", MB_OK | MB_ICONERROR );
LocalFree(msg);
}

以上で実行しようとすると、
「指定されたファイルに対してこの操作を行うアプリケーションが関連付けられていません・・・」
のエラーになってしまいます。
どのように改善していけばよいでしょうか。

ソースはあちこちのものをミックスして書いていて、半分意味も分からずで、とんでもないことをしているかも知れません(VCは初心者で、ハンドルとかクラス、プロセスとかの知識に乏しいです)
また、まったく別で良い方法(CreateProcessの方が簡単だとか)があれば、よろしくお願いします。

VC++6での質問す。
◆やりたいこと◆
(1)内部から外部exeを引数ありで呼び出し、処理をさせます。
(2)その外部exeの結果コードを内部的に受け取り、エラー処理させます。
(3)外部exeの処理実行中は、できればDOS窓を非表示にさせます。

system()呼び出しは最も簡単なのですが、(3)が上手くできませんでした。

◆やってみた方法◆
こちらの過去質問も参考に見よう見まねでShellExecuteExを使ってやってみようとしました。

SHELLEXECUTEINFO sei;
DWORDdwRC;
LPVOID msg;
BOOLres;

ZeroMemory(&se...続きを読む

Aベストアンサー

SHELLEXECUTEINFO構造体に設定する値が間違っています。
この場合は下記の値を設定します。
sei.lpVerb = "open"
sei.lpFile = "hoge.exe"
sei.lpParameters = "param1 param2"

あとGetExitCodeProcess関数を使用するためにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があるのでOpenProcess関数を使用してアクセス権を割り当ててください。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング