CreateProcess関数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
BUNGU

CreateProcess関数について

#1

投稿記事 by BUNGU » 14年前

CreateProcess関数についてのレスがあったんですが、
CreateProcess関数で自分が持ってるアプリを適当に起動させてみたいです。

どなたかコード教えてくださいませんか?

BUNGU

Re: CreateProcess関数について

#2

投稿記事 by BUNGU » 14年前

現在txt形式は起動できたのですが、
exe形式が起動できません、、、

どうすればいいでしょうかorz

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: CreateProcess関数について

#3

投稿記事 by beatle » 14年前

コマンドの実行あたりが役立つでしょうか。

適切なアドバイスをもらうには、試したソースコードと、上手く動かない場合のエラーメッセージや具体的な問題を書いて下さい。
フォーラムルール投稿前チェックリストをご一読ください。

BUNGU

Re: CreateProcess関数について

#4

投稿記事 by BUNGU » 14年前

ええと
ソースコード自体作れないので質問なうです(汗

コマンドってやつ試みましたができませぬ。。。

たとえばデスクトップのexeを何かひとつ起動させるにはどうすればいいのか

ご指南いただければ幸いです

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: CreateProcess関数について

#5

投稿記事 by beatle » 14年前

ソースコード自体作れないとはどういうことでしょうか。開発環境を持っていないのでしょうか。

「コマンドってやつを試みました」とはどのように試みたのでしょうか。ソースコードは作れないけどどうにかして試みたのでしょうか。
具体的に何をやったのか、きちんと書いて下さい。

試みましたが「できませぬ」というのは、具体的にどう「できない」のでしょうか。「できない」にもいろいろあります。
ソースコードの作り方が分からず、試すこともできない。
ソースコードは一応作ってみたが、コンパイルエラーが発生して実行することができない。
実行はできるけれど、何らかのエラーが発生して期待した動作にならない。
実行もできるし、何もエラーが発生していない(ように見える)が、期待した動作にならない。

また、「期待した動作」とは何か、きちんと書いて下さい。
「僕は~が・・・となると思ったのですが、実際は~が△△となってしまいました。
僕の予想では◯◯が怪しいなと思うのですが、どうでしょうか。」
BUNGU さんが書きました: たとえばデスクトップのexeを何かひとつ起動させるにはどうすればいいのか
これは正に、僕が紹介したコマンドの実行の中の「CreateProcess()」にて解説されていることなのですが、そこの記述のどこかが理解できないのでしょうか。理解出来ない部分があるなら、具体的にどこが理解できてどこができないのか、書いて下さい。

BUNGU

Re: CreateProcess関数について

#6

投稿記事 by BUNGU » 14年前

ええと

コード:

#include <windows>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int iRtn = 0;

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

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

    cout << "秀丸を起動します\n";

    // 秀丸を起動する
    if( !CreateProcess( NULL, // No module name (use command line). 
        "C:\\Program Files\\Hidemaru\\Hidemaru.exe", // Command line. 
        NULL,             // Process handle not inheritable. 
        NULL,             // Thread handle not inheritable. 
        FALSE,            // Set handle inheritance to FALSE. 
        0,                // No creation flags.
        NULL,             // Use parent's environment block.
        NULL,             // Use parent's starting directory.
        &si,              // Pointer to STARTUPINFO structure.
        &pi )             // Pointer to PROCESS_INFORMATION structure.
    )
    {
        cout << "CreateProcess failed.";
        iRtn = -1;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles.
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

    cout << "秀丸を終了しました\n";

    return iRtn;
}
これの
"C:\\Program Files\\Hidemaru\\Hidemaru.exe", // Command line.
は自分のデスクトップのexeのパスを書き換えればいいのですか?

あと

コード:

#include <windows>
#include <iostream>
がよく分かりません・・・
解説つけてくれたらうれしいです^^;

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: CreateProcess関数について

#7

投稿記事 by beatle » 14年前

BUNGU さんが書きました: "C:\\Program Files\\Hidemaru\\Hidemaru.exe", // Command line.
は自分のデスクトップのexeのパスを書き換えればいいのですか?
はい。その通りです。
このような、自分で少し実験すれば答えが分かるタイプの疑問を自分で試すことこそ、プログラミング上達への道です。
試す前から人に聞かずに、一度自分で実験してみてください。それでも上手くいかない場合に「~を試してみたのですが、△△となってしまいました。」のように質問するとGoodです。
BUNGU さんが書きました:あと

コード:

#include <windows>
#include <iostream>
がよく分かりません・・・
解説つけてくれたらうれしいです^^;
#includeは、指定されたヘッダファイルをその場所に取り込む命令です。
#include <iostream>
でしたら、iostreamというヘッダファイルの中身で、#include <iostream>の行を置き換えます。
BUNGUさんが貼りつけたプログラムでは、coutを使うためにiostreamをインクルードしています。
最初のうちは、#include <iostream>はcoutを使うための呪文だ、と覚えておいてもいいかもしれません。

同様に、
#include <windows>
は、「windows」というヘッダファイルを、その行のところへ取り込みます。
・・・しかし、これは恐らくサンプルプログラムのミスだと思います。僕が今まで見たプログラムでは、windowsではなくwindows.hをインクルードしています。
ということで、もしwindowsが見つからずにコンパイルが失敗するようでしたら、
#include <windows.h>
と修正してみてください。

BUNGU

Re: CreateProcess関数について

#8

投稿記事 by BUNGU » 14年前

ありがとうございます!
今度からそうするようにします!

それで実行してみました、
すると
'main' : ローカル関数の定義が正しくありません。
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

というエラーが表示されてしまいます
何処を直せば良いでしょうか。。。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: CreateProcess関数について

#9

投稿記事 by beatle » 14年前

そのエラーメッセージ、全部コピペしてますか?「必要なさそうだ」と勝手に判断して、重要な部分を省略してませんか?
本当に必要なメッセージかどうか判断が付くレベルになるまでは、エラーメッセージは全部コピペするといいです。

BUNGU

Re: CreateProcess関数について

#10

投稿記事 by BUNGU » 14年前

すみません

こんどから全部のエラーを書くようにします

エラー:

error C2601: 'main' : ローカル関数の定義が正しくありません。
error C2664: 'CreateProcessW' : 2 番目の引数を 'const char [33]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
error C3861: 'main': 識別子が見つかりませんでした

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: CreateProcess関数について

#11

投稿記事 by beatle » 14年前

エラーメッセージありがとうございます。
BUNGUさんの勉強のために、僕が感じるこのエラーメッセージの重要な場所を書いておきますね。
  • 'CreateProcessW' : 2 番目の引数を 'const char [33]' から 'LPWSTR' に変換できません。
    これは最重要と言ってもいいかもしれません。まさにエラーの原因が書いてあります。このメッセージをググると、似たような症状がたくさん引っかかります。
  • error C2601
    C2601でググると分かると思いますが、これはエラー番号です。で、このエラー番号が発生するエラーの例なんかを検索することができます。
    同じエラー番号のエラーになってしまうようなソースコードを読めば、自分のソースコードのどこが悪いのか、分かります。
逆に、あまり重要でないと思うところ
  • 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
型に関連がないのは、「2 番目の引数を 'const char [33]' から 'LPWSTR' に変換できません。」というメッセージから明らかですし、
「変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。」というメッセージはむしろ悪い解決策を提示してしまっています。キャストして型を変換しても正しく動きません。

BUNGU

Re: CreateProcess関数について

#12

投稿記事 by BUNGU » 14年前

なるほど
それでたったいま構成プロパティの文字をUnicodeから設定なしにかえてみたら

C2601: 'main' : ローカル関数の定義が正しくありません。
error C3861: 'main': 識別子が見つかりませんでした

というエラーが残ります

ローカル関数の定義とは何処ですればいいのでしょうか・・

BUNGU
記事: 2
登録日時: 14年前

Re: CreateProcess関数について

#13

投稿記事 by BUNGU » 14年前

解決しましたw

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

BUNGU
記事: 2
登録日時: 14年前

Re: CreateProcess関数について

#14

投稿記事 by BUNGU » 14年前

追記です

CLRのWindows フォームアプリケーションで実行していたので
Win32 コンソールアプリケーションに直してみたところ、正常に動作しました。
ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る