C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: VC++でWinMain関数からmain()関数への変更


(過去ログ 109 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■64862 / inTopicNo.1)  VC++でWinMain関数からmain()関数への変更
  
□投稿者/ undergo (3回)-(2013/01/18(Fri) 13:22:41)

分類:[.NET 全般] 

C言語初心者です。

VC++2008Proでデジタルフィルタを作成しているのですが、コンパイル時に以下のようなエラーが出てきます。

1>filterexe.obj : error LNK2001: 外部シンボル "@__security_check_cookie@4" は未解決です。
1>filterexe.obj : error LNK2001: 外部シンボル "__imp__waveOutPrepareHeader@12" は未解決です。
1>filterexe.obj : error LNK2001: 外部シンボル "__imp__waveOutOpen@24" は未解決です。
1>filterexe.obj : error LNK2001: 外部シンボル "__imp__printf" は未解決です。
1>filterexe.obj : error LNK2001: 外部シンボル "__imp__fopen" は未解決です。
1>filterexe.obj : error LNK2001: 外部シンボル "__imp__fread" は未解決です。
1>filterexe.obj : error LNK2001: 外部シンボル "__imp__waveOutWrite@12" は未解決です。
1>filterexe.obj : error LNK2001: 外部シンボル "__imp__fclose" は未解決です。
1>filterexe.obj : error LNK2001: 外部シンボル "__imp__exit" は未解決です。
1>Z:\two_year\総合制作\filterexe\test\Release\test.exe : fatal error LNK1120: 外部参照 9 が未解決です。

 この場合、現在WinMain関数で作成している、ところをmain関数に変更しなければいけないと聞いたのですが、
少し調べてみたところ、WinMain関数じゃないとWindowsアプリが動かないと書いていました。

 作成しているアプリケーションは、ボタンなどの操作のため、Windowsアプリケーションでの操作になります。

 この条件を踏まえて、どなたかこのエラーの解消方法を知っている方がいれば教えていただけたら嬉しいです。
引用返信 編集キー/
■64863 / inTopicNo.2)  Re[1]: VC++でWinMain関数からmain()関数への変更
□投稿者/ とっちゃん (36回)-(2013/01/18(Fri) 13:44:22)
とっちゃん さんの Web サイト
No64862 (undergo さん) に返信
> C言語初心者です。
>
> VC++2008Proでデジタルフィルタを作成しているのですが、コンパイル時に以下のようなエラーが出てきます。
>
> 1>filterexe.obj : error LNK2001: 外部シンボル "@__security_check_cookie@4" は未解決です。
> 1>filterexe.obj : error LNK2001: 外部シンボル "__imp__waveOutPrepareHeader@12" は未解決です。
> 1>filterexe.obj : error LNK2001: 外部シンボル "__imp__waveOutOpen@24" は未解決です。
> 1>filterexe.obj : error LNK2001: 外部シンボル "__imp__printf" は未解決です。
> 1>filterexe.obj : error LNK2001: 外部シンボル "__imp__fopen" は未解決です。
> 1>filterexe.obj : error LNK2001: 外部シンボル "__imp__fread" は未解決です。
> 1>filterexe.obj : error LNK2001: 外部シンボル "__imp__waveOutWrite@12" は未解決です。
> 1>filterexe.obj : error LNK2001: 外部シンボル "__imp__fclose" は未解決です。
> 1>filterexe.obj : error LNK2001: 外部シンボル "__imp__exit" は未解決です。

いずれもリンクすべきライブラリが足りないために発生しています。
通常、__imp__printf などのリンクエラーが出ることはありません。おそらくプロジェクトの設定で
本来やる必要のないことを行っているため、リンクすべきライブラリがリンクできない状態になっていると思われます。

もし、コマンドラインで cl filterexe.c としているのであれば、きちんとプロジェクトを作成してビルドすることをお勧めします。

>  この場合、現在WinMain関数で作成している、ところをmain関数に変更しなければいけないと聞いたのですが、
> 少し調べてみたところ、WinMain関数じゃないとWindowsアプリが動かないと書いていました。
>
>  作成しているアプリケーションは、ボタンなどの操作のため、Windowsアプリケーションでの操作になります。
>
Windowsで動き、CあるいはC++で作成する画面表示機能を持つプログラムは

コンソールアプリとGUIアプリの2種類に分かれます。

コンソールアプリは、コマンドプロンプトで利用するためのもので、実行時にユーザーの操作を必要としないプログラムで
利用されたり、Windowsに限定されない言語説明用のサンプルプログラムで使われたりします。

これに対し、GUIアプリは、Visual Studio などと同じように画面上に独自のWindowを開きそこでの操作を行いながら動くプログラムとなります。


今回の場合、ボタンを置きたいということなので、GUIアプリを作成したいのだと思いますが、
その場合、printf(プログラム内のどこかで利用しています)での表示画面がない(printfはコンソールに表示するため)ので意図した動作にはなりません。
その部分で修正が必要となります。


>  この条件を踏まえて、どなたかこのエラーの解消方法を知っている方がいれば教えていただけたら嬉しいです。
リンクライブラリに、winmm.lib および、Cランタイムライブラリを追加してください。
多分ほかに何かエラーが出ていてそれを解消しようとした結果、__imp__fopen なども出るようになったのだと思いますが。。。

引用返信 編集キー/
■64864 / inTopicNo.3)  Re[1]: VC++でWinMain関数からmain()関数への変更
□投稿者/ 774RR (49回)-(2013/01/18(Fri) 14:10:31)
security_cookie はデバッグ用の機能なので「正しくリンクできれば」消える。
wave*** は winmm.lib をリンクすれば消える

ということであとは CRT (C Run-Time) 関数なわけだけど
fopen, fread, fclose は Window アプリケーションで使ってまったく問題ない
printf, exit は Window アプリケーションで使うことに意味が無い=要修正

症状としては No64696 のときと同様で、
その意味を理解しないままプロジェクトなりワークスペースなりの設定変更をした結果、
誤った設定になっているがゆえにエラーになっている、だ。
正しい設定に戻せばリンクエラーは消えるだろう。

引用返信 編集キー/
■64892 / inTopicNo.4)  Re[2]: VC++でWinMain関数からmain()関数への変更
□投稿者/ undergo (5回)-(2013/01/21(Mon) 12:27:28)
No64863 (とっちゃん さん) に返信


連絡遅くなってすいません。


皆さんに言われた通りに、もう一度作り直して、プロジェクトを「新規作成」→「win32プロジェクト」→「空のプロジェクト」にチェックして既存の項目追加で、ソースファイルを追加し、リンクライブラリに、winmm.libを追加して、printf,exitの修正を行ったのですが、

: error C2664: 'lstrlenW' : 1 番目の引数を 'char [1000]' から 'LPCWSTR' に変換できません。
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
: error C2664: 'MessageBoxW' : 2 番目の引数を 'const char [9]' から 'LPCWSTR' に変換できません。
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

というエラーが出ました。
このエラーは、文字セットを「Unicode 文字セットを使用する」から、「マルチ バイト文字セットを使用する」
に変更するといいと聞いていたので、設定を変更したところ、

1>MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
1>\\FILE\Redirect$\Student\523\52329\Desktop\test\Debug\test.exe : fatal error LNK1120: 外部参照 1 が未解決です。

というエラーが出てきました。
このエラーは、tchar.hをインクルードすれば解決されると聞いたので、そうしてみましたが解決されません。
何度も申し訳ありませんが、原因はまたプロジェクトの設定にあるのでしょうか?


引用返信 編集キー/
■64894 / inTopicNo.5)  Re[3]: VC++でWinMain関数からmain()関数への変更
□投稿者/ 774RR (50回)-(2013/01/21(Mon) 13:52:31)
Window アプリケーション (非コンソールアプリケーション) の開始関数は
WinMain または wWinMain または _tWinMain のどれか、ということになっている。
_tWinMain を使う場合には <tchar.h> が必要。

Q.自作ソースコード中に WinMain または wWinMain または _tWinMain はあるのか?
無い→適切な WinMain/wWinMain/_tWinMain を作るべし
ある(またはあるつもり)→その関数定義を見せておくれ

http://msdn.microsoft.com/ja-jp/library/ff381406(v=vs.85).aspx
の wWinMain は誤っている。
http://msdn.microsoft.com/ja-jp/library/ff381409(v=vs.85).aspx
こっちは OK

要は
int WinMain(...) は誤りで
int WINAPI WinMain(...) または int __stdcall WinMain(...) は正解、ってことだ。
引用返信 編集キー/
■64903 / inTopicNo.6)  Re[4]: VC++でWinMain関数からmain()関数への変更
□投稿者/ undergo (7回)-(2013/01/21(Mon) 17:09:59)
No64894 (774RR さん) に返信
> Q.自作ソースコード中に WinMain または wWinMain または _tWinMain はあるのか?
> 無い→適切な WinMain/wWinMain/_tWinMain を作るべし
> ある(またはあるつもり)→その関数定義を見せておくれ

void WinMainCRTStartup()

あるつもりかもわかりませんが、今の関数定義です。(この部分だけでよろしいでしょうか?)


ちなみに、現在デジタルフィルタのプログラムを作成していて、上の定義のまま、

「音の生成」→「フィルタをかけて再生」は出来ました。

ここから、

「ファイルの読み込み」→「フィルタをかけて再生」が上手くいきません。


引用返信 編集キー/
■64904 / inTopicNo.7)  Re[5]: VC++でWinMain関数からmain()関数への変更
□投稿者/ 774RR (51回)-(2013/01/21(Mon) 18:05:22)
> void WinMainCRTStartup()
は、本来 Visual C++ のライブラリの中にある関数で、自作すべきものぢゃない。
通常自作すべきは WinMain または wWinMain である。
# もしほんとうにこれを自作してるのであれば、の話。

WinMainCRTStartup を自作するってことがどういうことか、100%理解したうえでやっているならよし、
そうでないなら参考元としている書籍なりホームページなりを変更したほうがいいと思うぞ。
そんなことしてるから普通には遭遇しないエラーが発生して困ったことになっているわけで。

> 上の定義のまま・・・出来ました。
理解せずやっているのなら、できたのは偶然だろうね。動作保証は無いよ。

遠回りなようだが、まずは何もしない Window アプリを作ってみたほうがいいと思う。
新規作成→Win32プロジェクト→Windows アプリケーションで作られる雛形くらいは見ておいたほうがいい。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -