利用規約の変更について

VC++ 6.0 Win98

カレントディレクトリに実行ファイルをいれておいて、szCommand[]="eee"とすると(eeeは実行ファイルです。)実行してくれるのですが、相対パスや絶対パスを使うと実行をしてくれません。
CreateProcessでは、相対パスや絶対パスは使えないのでしょうか?
ちなみにコマンドラインから直接(相対パスや絶対パスを使用して)に打つと実行ファイルが動作します。

あと、リダイレクトも使えないのでしょうか?(動作しなかったので・・)

STARTUPINFO si;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
si.dwFlags=STARTF_USESTDHANDLES;
si.hStdOutput=hFile;
si.hStdError=hFile;
char szCommand[]= "C:\\\"My Documents\"\\nannka\\VC++\\Ten3\\eee";

PROCESS_INFORMATION pi;
CreateProcess(
NULL,
szCommand,//コマンド
//NULL,
NULL,NULL,
TRUE, 0,
NULL,NULL,
&si,&pi
);


よろしくお願いします。

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

A 回答 (3件)

> もし、お時間がありましたら部分的に囲み方法ではダメなのか教えてもらえないでしょうか?



「*何故* ダメなのか?」ってこと?

想像でしかないですが、解釈する人が違うから、としか言いようが無いですね。

コマンドラインからの場合は、cmd.exe (もしくは Shell) が解釈している。CreateProcess の場合には違う人が解釈している、と。
    • good
    • 0
この回答へのお礼

もっと勉強して理解していこうと思います。

ありがとうございました。

お礼日時:2003/01/18 17:07

> 相対パスが使えないのはわかるのですが、絶対パスが使えないのがわかりません。



ああ、きちんと質問を読んでなかった。
私が最初に書いたのは、第一引数のことでした。これは NULL にできますね。

であれば、空白を含むディレクトリの扱いが良くないのでしょう。
ダブルクォートで、My Documents だけをくくるのではなく、コマンド全体をくくってください。

char szCommand[] = "\"c:\\My Documents ... \\eee\"";
    • good
    • 0
この回答へのお礼

出来ました!ありがとうございます。
でも、なぜ、My Documentsの部分だけではダメかわかりません。コマンドライン上だったら大丈夫なのに。。

szCommandの部分がコマンドライン上の命令と一致していると考えていたのですが、微妙に違うみたいですね。

もし、お時間がありましたら部分的に囲み方法ではダメなのか教えてもらえないでしょうか?

明日には締め切りたいと思います。
ありがとうございました。

お礼日時:2003/01/17 16:07

> CreateProcessでは、相対パスや絶対パスは使えないのでしょうか?



使えません。マニュアルに「フルパスで」と書いてありますね。

> あと、リダイレクトも使えないのでしょうか?(動作しなかったので・・)

">" を書いてもリダイレクトにはなりません。STARTUPINFO を利用します。

この回答への補足

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

>使えません。マニュアルに「フルパスで」と書いてありますね。

相対パスが使えないのはわかるのですが、絶対パスが使えないのがわかりません。
フルパスは絶対パスのことじゃないんですか?

補足日時:2003/01/17 14:29
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

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...続きを読む

QCreateProcessの制御について

今回exeから別exe(or bat)を起動させる処理を作成しようとしているのですが、
呼び出した後(今回であればnotepad.exe)5秒程度砂時計マークがでる状態になるのです。(バッチでも同じ)
なにか原因があるのでしょうか。また、対処方があれば教えてください。

【前提】
・本体exeにウィンドウは必要なし
・バッチの場合はcmd.exeは非表示

【環境】
・XP SP2 でコンパイル。 bcc32 5.5.1 と VB6
・実行はXP SP2 とWin2000 双方で同様の結果

【ソース】
#include<windows.h>

int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance ,
PSTR lpCmdLine ,int nCmdShow ) {

PROCESS_INFORMATION pi;
STARTUPINFO si;

ZeroMemory(&si,sizeof(si));
si.cb=sizeof(si);

CreateProcess(NULL,"notepad.exe",NULL,NULL,FALSE,CREATE_NO_WINDOW|NORMAL_PRIORITY_CLASS,
NULL,NULL,&si,&pi);


CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
return 0;
}

今回exeから別exe(or bat)を起動させる処理を作成しようとしているのですが、
呼び出した後(今回であればnotepad.exe)5秒程度砂時計マークがでる状態になるのです。(バッチでも同じ)
なにか原因があるのでしょうか。また、対処方があれば教えてください。

【前提】
・本体exeにウィンドウは必要なし
・バッチの場合はcmd.exeは非表示

【環境】
・XP SP2 でコンパイル。 bcc32 5.5.1 と VB6
・実行はXP SP2 とWin2000 双方で同様の結果

【ソース】
#include<windows.h>

int WINAPI WinM...続きを読む

Aベストアンサー

WaitForSingleObject(pi.hProcess,INFINITE);
とすると、ウィンドウを持ったプロセスの場合、起動したプロセスが終了するまで砂時計が表示されます。
今回のウィンドウなしでも砂時計が出る原因はちょっとわかりません。
VC20005では砂時計はでませんでしたので、コンパイル環境の問題かもしれませんね。

こうしてみてはどうでしょう?
while(WaitForSingleObject(pi.hProcess,0) == WAIT_TIMEOUT){
Sleep(100); // 適当な時間待たせます。
};

参考までに、GetExitCodeProcess(pi.hProcess,&exitCode); とすれば、起動したプロセスの終了コードを取得できます。

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() を使えとか書いてあるけど。

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) {
// ここに処理を書く
}
という関数が必要なようです。

QCString から LPCTSTRの型に変換

visual studio 2013 VC++を使用していますが、WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。実際にどのようにするのかわかりません。
例えば、以下のサンプルは他の質問コーナーの回答をアレンジしたものです

CString str = _T("ABC");
int siz = str.GetLength()+1;
LPCTSTR pszFName = new TCHAR[siz];
_tcscpy_s( pszFName, siz, str );

で変換するのですが
LPCTSTRからwchar_t*へ変換できませんとエラーがでます
_tcscpy_s()は使用できないのでしょうか

Aベストアンサー

>APIはCStdioFile の Open()でファイル名を与えるところ

APIではないようですが……。

http://msdn.microsoft.com/ja-jp/library/ee247566.aspx
ならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。

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関数を使用してアクセス権を割り当ててください。

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

QCreateProcessのコマンド・ライン文字列

■開発環境:VisualStudio2005 VC++

CreateProcessの第2引数についての質問なのですが、

第二引数は実行するコマンドライン文字列となりますが、この引数のサイズがある一定のサイズを超えるとCreateProcessの実行でエラーになります。

その場合のGetLastError()の番号は87=ERROR_INVALID_PARAMETERです。

どうも、CreateProcessの第2引数のサイズに上限があるように思います。
どなたこのあたりの情報を持っておられる方いますでしょうか?

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

Aベストアンサー

>どうも、CreateProcessの第2引数のサイズに上限があるように思います。
>どなたこのあたりの情報を持っておられる方いますでしょうか?

http://msdn.microsoft.com/en-us/library/ms682425.aspx
より
>The command line to be executed. The maximum length of this string is 32,768 characters, including the Unicode terminating null character. If lpApplicationName is NULL, the module name portion of lpCommandLine is limited to MAX_PATH characters.

となっています。
VS2005付属の日本語版の方のMSDNでは記述がカットされているようですが…。
こういう場合は英語のドキュメントにあたった方がよいです。

QVC++ で.bat起動

また、こちらを使わせていただきます。
VC++で.batファイルを起動しようとしていますが、cmdはあくのですが、.batが起動しません。他の参考にしてますが、なかなかたどり着きません。どなたか、アドバイスお願いいたします。

.bat fileは次のとおりです。
cd\Program Files\Wireshark>
tshark -i.2 greater 170 -a duration:2 -w....
tshark -v-r e:\Test\test5.pcap....

VC++は次のとおり
void CStartupapplicationView::OnBnClickedButtontest()
{
//cmdは、ShellExecuteでも、CreateProcessでも開けられますが、
//bat fileの起動がうまくいきません。
HINSTANCE ret = ShellExecute(m_hWnd,"open","cmd.exe",NULL,"c:\\Program Files\\Wireshark",SW_SHOWNORMAL);

ShellExecute(m_hWnd,"open","c:Program Files\\Wireshark\\test.bat",SW_SHOW);
//.batファイルは、c:Program Files\Wiresharkの下に入っています。//が、.Batは起動しません。

if (ret <= (HINSTANCE)32) AfxMessageBox("can not Shell.",MB_OK);

//別の方法
STARTUPINFO sinfo;
PROCESS_INFORMATION pinfo;
ZeroMemory(&sinfo,sizeof(STARTUPINFO));
ZeroMemory(&pinfo,sizeof(PROCESS_INFORMATION));
sinfo.cb=sizeof (STARTUPINFO);
sinfo.dwFlags=STARTF_USESHOWWINDOW;
sinfo.wShowWindow=SW_SHOWNORMAL;

if(!CreateProcess(NULL,_T("cmd.exe c:\\test2.bat "),
// test2.batは、Document and settings/-----------
//Startup applicationの下にはいっていますが、起動しません。
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&sinfo,
&pinfo));
{//起動失敗
}
//

また、こちらを使わせていただきます。
VC++で.batファイルを起動しようとしていますが、cmdはあくのですが、.batが起動しません。他の参考にしてますが、なかなかたどり着きません。どなたか、アドバイスお願いいたします。

.bat fileは次のとおりです。
cd\Program Files\Wireshark>
tshark -i.2 greater 170 -a duration:2 -w....
tshark -v-r e:\Test\test5.pcap....

VC++は次のとおり
void CStartupapplicationView::OnBnClickedButtontest()
{
//cmdは、ShellExecuteでも、CreateProcessでも...続きを読む

Aベストアンサー

コマンド受け渡しの根本を理解されていないのが原因です
(#4に書きましたがフォルダにスペース名が入っているのが原因です)

コマンドラインでコマンドを打つときはスペースを区切りとして文字が分断されます
例) プログラム sample.exe として バラメータに
   C:\Program Files と渡したしたいとしましょう

コマンドで sample c:\Program Files と打つと
sample.exeには c:\Program と Files という2個のパラメータが送られるのです
これをスペース含めた1個のパラメータとして渡したい場合
コマンドで sample "c:\Program Files" のようにスペース含む部分を " で囲う必要があるのです

上がちゃんと理解できていれば私が #4/#5 で書いたコードの意味と
御自身で書いたコードが思ったように動かない理由が分かることでしょう

あえてひょっとしたら知らないかな と思うのが
Cの場合 "" で囲った中に " を含みたいときは \" と記載します
ってことです

後は御自分でお考えください
(これ以上の説明は出来ないので以後こちらが補足することはありません)

コマンド受け渡しの根本を理解されていないのが原因です
(#4に書きましたがフォルダにスペース名が入っているのが原因です)

コマンドラインでコマンドを打つときはスペースを区切りとして文字が分断されます
例) プログラム sample.exe として バラメータに
   C:\Program Files と渡したしたいとしましょう

コマンドで sample c:\Program Files と打つと
sample.exeには c:\Program と Files という2個のパラメータが送られるのです
これをスペース含めた1個のパラメータとして渡したい場合
...続きを読む

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);


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

人気Q&Aランキング

おすすめ情報