dポイントプレゼントキャンペーン実施中!

元々スレッドの生成を
CreateThread(NULL, 0, ThreadFunc, (LPVOID)&param, 0, &dwID);
としていたのですが、
生成したスレッドがC言語のライブラリを利用する場合、
CreateThread()ではなく_beginthread()を使うとMSDNに記載されていました。
そこでプログラムを_beginthread()に書き換えたのですが、
『error C2440: '関数' : 'DWORD (__stdcall *)(LPVOID)' から 'void (__cdecl *)(void *)' に変換できません。』
『warning C4024: '_beginthread' : の型が 1 の仮引数および実引数と異なります。』
とのエラーが表示されてしまいます。

アドバイスをよろしくお願いします。


#include <windows.h>
#include <process.h>

#define APP_NAME TEXT("Sample_MainWindow")

typedef struct _ThreadParam {
  HWND owner;
  POINT point;
} ThreadParam;

DWORD WINAPI ThreadFunc(LPVOID vdParam) {
     ・
    (省略)
     ・
}

LRESULT CALLBACK WindowProc(
  HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
) {
  ThreadParam param;

  switch(uMsg) {
    case WM_LBUTTONDOWN:
      param.owner = hWnd;
      param.point.x = LOWORD(lParam);
      param.point.y = HIWORD(lParam);

      _beginthread(ThreadFunc, 0, &param);
      return 0;
    }

  return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

A 回答 (1件)

エラーメッセージの通りの問題です。


曰く、「引数の方が違う」
_biginthread()で使用するプロセス関数は「void processname(void *parameter)」で宣言する必要があります。
>DWORD WINAPI ThreadFunc(LPVOID vdParam) {
では、宣言形式を満たしていません。
    • good
    • 0
この回答へのお礼

ご指摘の通り、
VOID ThreadFunc(LPVOID vdParam) {
と変更することで正常にコンパイル出来ました。
呼び出し規約についての理解が不十分でした。

回答して頂きましてありがとうございます!

お礼日時:2009/12/07 16:53

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


このQ&Aを見た人がよく見るQ&A