• ベストアンサー

C&C++からC#のexeを呼ぶ方法

いつもお世話になっております。 環境 Windows VISTA SP1 Visual Studio 2008 疑問 C(C++)からC#で作られたexeを呼ぶ方法がわかりません。 ret = CreateProcess(NULL,Common_Data->exename,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); の様にCreateProcessではexeを呼べません。 (Common_Data->exenameにはGetCurrentDirectory使って 絶対パス指定してます) おそらくC#でつくったプロジェクトの設定を変えてビルド する必要があると推測していますが どうすればいいのかわからないです。 以上 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.3

「CreateProcess error 998 ERROR_NOACCESS」 でぐぐってみたところ、以下のような情報がありました。 http://fujiyoshisyouta.blog72.fc2.com/blog-entry-209.html STARTUPINFO構造体(si)は、正しく初期化してますか? 特に、si.cbにSTARTUPINFO構造体のサイズが正しく入っていないと、 今回のようなエラーを返却する可能性が高いと思います。 http://itpro.nikkeibp.co.jp/article/COLUMN/20070126/259762/ を参考にしてください。

ringist
質問者

お礼

こんばんは! 具体的な例をあげてくださって本当に助かりました。 初期化をきっちりしないとだめなんですね 今回は私は初期化のタイミングがうまくいっていなかった様で CreateProcess直前で初期化してexeをよんだら うまくいきました! アドバイス参考になりました!本当にありがとうございます!

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

#2です。 si.cbの初期化忘れてました。

すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

exeである以上、CreateProcessで呼べないということはありません。 > ret = CreateProcess(NULL,Common_Data->exename,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); 単純に TCHAR cmd[]=_T("~~~~~~~~"); STARTUPINFO si; memset(&si,0,sizeof(si)); PROCESS_INFORMATION pi; CreateProcess(NULL,cmd,NULL,NULL,FALSE,0,NLLL,NULL,&si,&pi); だと、どうなんでしょう。 あと、C#以外のexe、例えばnotepadとかは起動可能なのでしょうか。 純粋にexeを起動するだけのプログラムで試したりはしたのでしょうか。

ringist
質問者

お礼

ありがとうございます。 そのようなテストも大事ですね 勉強になりました。 問題の原因は、初期化のタイミングでした。 私は INITDIALOGの中で初期化を行っていたのですが これがどうもうまく機能していませんでした。 原因は分かりません^^;規模が大規模なシステムなので・・ (これは原因じゃないとは思いますが・・・) ボタンを押したらC#のexeを呼ぶ実装をしていたのですが、 そのボタンをおしたときに初期化処理をするように修正したら 無事に呼べました! ありがとうございました!

すると、全ての回答が全文表示されます。
  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.1

念のため試してみましたが、普通にCreateProcess()でC#のexeは呼べます。 そのC#プログラムが普通にコマンドプロンプトから起動できるよう 作られているなら、CreateProcess()で起動できると思います。

ringist
質問者

お礼

こんばんは ご回答ありがとうございます。 C#で作ったexeは、cmd(コマンドプロンプト)で呼べます。 GetLastErrorで調べたら 998で 不正なメモリにアクセスしています みたいなエラーの様 です。 そこで、呼ぶPATHをチェックしているのですが、 sprintf_s(Common_Data->IniFilePath,256,"%s\\project\\bin\\Release\\project.exe",Common_Data->CurrentDirectory); という感じでやっています 念のため、PATHをtxtに吐き出して直接コピペして アクセスしてみたのですがやはりC#のexeは立ち上がります。 うーん OSとの相性が悪いのかな。。

ringist
質問者

補足

ちなみに確認ですが、 「CからC#のexeを呼ぶ」ということです。 C#からC#は問題なく大丈夫だと思います。

すると、全ての回答が全文表示されます。

関連するQ&A