アプリ版:「スタンプのみでお礼する」機能のリリースについて

過去に近い質問が出ていましたが、探しているような回答が見つからなかったので質問させていただきます。

プログラム作成の過程で_beginthreadを使うことになったのですが、以下のエラーメッセージが表示されます。

error C2664: '_beginthread' : 1 番目の引数を 'void (unsigned long)' から 'void (__cdecl *)(void *)' に変換できません。 (新しい機能 ; ヘルプを参照)
スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません

調べた限りC++で作成している為Cでコンパイルされた関数を呼び出す為にC++で指示する必要がある、という事は理解できたのですが、いまいち修正の方法が判りません。

下記に関連部分ソースの一部と開発環境を記載します。
どなたかご教授の方よろしくお願いいたします。
開発環境:Visual C++6.0
プロジェクトの設定でランタイムライブラリはマルチスレッドに設定済み。
WINAPIとして作成、指定URLに接続するためのスレッドを作成したい

-------------------グローバル一部---------------
DWORD cthread=0; //グローバルで宣言している
addurl[1];

-----------問題の処理WndProc内部(メイン部)---------

addurl[0]=url; //編集したアドレスを貼り付け
cthread=_beginthread(OpenURL,0,0); //ここでエラー

-----------送る先(OpenURL)-------------

void __cdecl OpenURL(DWORD index)
{
BASS_StreamFree(chan); // close old stream
SendMessage(Edit,WM_SETTEXT,0,"connecting...");
if (!(chan=BASS_StreamCreateURL(addurl[index],0,BASS_STREAM_META|BASS_STREAM_STATUS,StatusProc,0))) {
SendMessage(Edit,WM_SETTEXT,0,"not playing");
Error("Can't play the stream");
--------------以下省略---------------

A 回答 (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だろうがアドレスで渡せるのです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/08/08 12:44

_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の再定義エラーが出てしまいます。
できればもうちょっと詳しく説明をいただきたいです。

補足日時:2005/08/08 06:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!