ページ 11

フォームからアプリが起動できない(VS2012Express)

Posted: 2013年8月29日(木) 08:54
by ren
お世話になっております。

現在、簡単なアプリケーションランチャーを作成しようとしています。
環境はVisual Studio 2012 expressで、普段はC言語+DXライブラリで
ソフトの開発を行っています。

今回、作成したフォームアプリケーション(ランチャー)から
指定したプログラムを起動させることが出来ず
困っているため質問致します。

画面には4つのボタン(インストール、起動、アンインストール、終了)があり、
終了ボタン以外は指定したプログラムを起動するだけのものです。
ただし、インストール状況、インストール先をレジストリで管理し、
インストール前の状態では、起動、アンインストールボタンを非活性に、
インストール後の状態ではインストールボタンが非活性に、
またインストール後は起動ボタンを押すとレジストリに登録された位置の
プログラムを起動する仕様です。
(レジストリへの登録はインストーラ側で行うので、ここでは無視してください。)

このような仕様のもと、まずはVisualStudio内でボタンを配置して、
クリック時にShellExecute()が実行されれば、まずはインストールボタンの処理は
完成かと思ったのですが、フォームアプリケーション内でShellExecuteを記述すると、
ビルド時にエラーになってしまいます。

どうすれば解決する問題なのでしょうか。

Re: フォームからアプリが起動できない(VS2012Express)

Posted: 2013年8月29日(木) 09:50
by h2so5
エラーの内容を書いてください。

Re: フォームからアプリが起動できない(VS2012Express)

Posted: 2013年8月29日(木) 09:53
by みけCAT
「普段は」C言語+DXライブラリを使っているとのことですが、わざわざ「普段は」と書くということは、
今使っている言語は違うという印象を受けます。どの言語を使っているのでしょうか?

また、エラーが出た際は、エラーメッセージを貼っていただくと答えやすくなります。
ren さんが書きました:どうすれば解決する問題なのでしょうか。
「フォームアプリケーション」がどういうものか良くわかりませんが、
System.Diagnostics.Process.Start("起動したいファイル名")でできるかもしれません。
http://dobon.net/vb/dotnet/process/openfile.html
また、system("起動したいファイル名")でもできるかもしれません。
http://okwave.jp/qa/q5304864.html
WinExec関数CreateProcess関数もあります。

どの程度の演出や装飾をしたいかわかりませんが、説明だけを見ると単純な仕様に見えるので、
素直にDev-C++を用い、C言語でコードを書いてアプリケーションを作成する、ということも一つの解決法です。

Re: フォームからアプリが起動できない(VS2012Express)

Posted: 2013年8月29日(木) 20:19
by ren
ご返信ありがとうございます。
今回作成している画面は、
VisualStudioから ファイル→新しいプロジェクト→Visual C++→CLR→カラのCRLプロジェクト で作成したものです。

ボタン設置箇所は以下のように書いています(最初にwindows.hをインクルードしています。

コード:

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    ShellExecute(NULL, L"open", L"notepad.exe",NULL,NULL,SW_SHOWNORMAL);
}
しかし、これをビルドすると、以下のエラーが発生します。

エラー 1 error LNK2028: 未解決のトークン (0A000041) "extern "C" struct HINSTANCE__ * __stdcall ShellExecuteW(struct HWND__ *,wchar_t const *,wchar_t const *,wchar_t const *,wchar_t const *,int)" (?ShellExecuteW@@$$J224YGPAUHINSTANCE__@@PAUHWND__@@PB_W111H@Z) が関数 "private: void __clrcall mainlauncher::MainForm::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@MainForm@mainlauncher@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) で参照されました。 C:\Users\xxxxx\project\launcher\main-launcher\MainForm.obj main-launcher
エラー 2 error LNK2019: 未解決の外部シンボル "extern "C" struct HINSTANCE__ * __stdcall ShellExecuteW(struct HWND__ *,wchar_t const *,wchar_t const *,wchar_t const *,wchar_t const *,int)" (?ShellExecuteW@@$$J224YGPAUHINSTANCE__@@PAUHWND__@@PB_W111H@Z) が関数 "private: void __clrcall mainlauncher::MainForm::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@MainForm@mainlauncher@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) で参照されました。 C:\Users\xxxxx\project\launcher\main-launcher\MainForm.obj main-launcher
エラー 3 error LNK1120: 2 件の未解決の外部参照 C:\Users\xxxxx\project\launcher\main-launcher\Debug\main-launcher.exe 1 1 main-launcher

ご紹介いただいた他の方法は今から試してみます。ありがとうございます。

Re: フォームからアプリが起動できない(VS2012Express)

Posted: 2013年8月29日(木) 20:37
by h2so5
#include <windows.h> の下に、以下のプリプロセッサを追加してください。

コード:

#pragma comment(lib, "shell32.lib")
これでビルドはできると思います。

ren さんが使っているのはC言語でもC++でもないC++/CLIというものですが、
アプリケーションランチャーを作成するのであればC++/CLIを使うメリットが無いので、代わりにC#をおすすめします。