- ベストアンサー
C++の_beginthreadで発生するエラーについて
- C++でプログラムを作成している際に、_beginthread関数を使用するとエラーメッセージが表示されます。
- エラーメッセージ「error C2664: '_beginthread' : 1 番目の引数を 'void (unsigned long)' から 'void (__cdecl *)(void *)' に変換できません。」が表示されます。
- このエラーはC++で作成しているため、Cでコンパイルされた関数を呼び出すためにC++で指示する必要があります。修正方法については不明です。
- みんなの回答 (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だろうがアドレスで渡せるのです。
その他の回答 (1)
- sha-girl
- ベストアンサー率52% (430/816)
_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するのがよいかと思います。
補足
説明不足でした。 各コードの実行順番は OpenURLが先に宣言され、最後にWinmainが宣言されています。 sha-girlさんの方法を試してみましたがdwindexの再定義エラーが出てしまいます。 できればもうちょっと詳しく説明をいただきたいです。
お礼
無事処理できました、有り難うございます。