• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:_beginthreadにて発生するコンパイルエラーについて)

C++の_beginthreadで発生するエラーについて

このQ&Aのポイント
  • C++でプログラムを作成している際に、_beginthread関数を使用するとエラーメッセージが表示されます。
  • エラーメッセージ「error C2664: '_beginthread' : 1 番目の引数を 'void (unsigned long)' から 'void (__cdecl *)(void *)' に変換できません。」が表示されます。
  • このエラーはC++で作成しているため、Cでコンパイルされた関数を呼び出すためにC++で指示する必要があります。修正方法については不明です。

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

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

>OpenURLが先に宣言され、最後にWinmainが宣言されています。 今回のトラブルとは関係ないですね。 >dwindexの再定義エラーが出てしまいます。 同じ変数名がでてきているからでしょう。 DWORD* dwindex2 = new DWORD; *dwindex2 = 0; cthread=_beginthread(OpenURL,0,&dwindex2); にしてください。 >できればもうちょっと詳しく説明をいただきたいです。 _beginthreadの引数についてMSDNをみながら理解してください。 1番目の引数は関数ポインタです。 これは void FNC (void* p)という形の関数でなければいけません。 「error C2664:は関数の型が違っている為おきました。」 これはここにvoid FNC (DWORD p)を渡したからおきました。 2番目の引数はスタックサイズです。これは0に設定されていますが 0は特別な値で0を設定すると自動でスタックサイズが決まります。 恐らく2Mがぐらいのスタックが設定されていますが今回は0でかまいません。 (スタックがわからなければ別途しらべてください。) 3番目の引数は FNCの関数の引数を渡します。関数の型がvoid FNC (void* p)なので 当然void*型でなければなりません。 ちなみに引数がvoid*なのかはわかりますか? 要はvoid*にしておけば配列だろうが構造体だろうが何でも アドレスで渡せるからそういう仕組みになっているのです。 void FNC (void* p)がもしvoid FNC (char p) だったとすると DWORD(unsigned long)を渡す事が出来ないですよね。 でもvoid*であることによって DWORDだろうが、charだろうがアドレスで渡せるのです。

miketti
質問者

お礼

無事処理できました、有り難うございます。

その他の回答 (1)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

_beginthreadの 1番目の引数である関数ポインタの型が 違うからです。 void __cdecl OpenURL(DWORD index) { を void __cdecl OpenURL(void* p) { DWORD index = *(DWORD*)p; とすればなおると思います。 'void (unsigned long)' すなわち void (DWORD)の関数をvoid(void*)に直せないといっているのです。 呼び出しは cthread=_beginthread(OpenURL,0,0); ではなく DWORD* dwindex = new DWORD; *dwindex = 0; cthread=_beginthread(OpenURL,0,&dwindex); としてスレッド終了時にスレッド側でdeleteするのがよいかと思います。

miketti
質問者

補足

説明不足でした。 各コードの実行順番は OpenURLが先に宣言され、最後にWinmainが宣言されています。 sha-girlさんの方法を試してみましたがdwindexの再定義エラーが出てしまいます。 できればもうちょっと詳しく説明をいただきたいです。

関連するQ&A