1

.net から呼び出したいクラスがあります。クラスを「ref」として装飾しました。Thread を使用して呼び出す予定の非静的メソッド「someFunc」があります。

// Ah には次のコードがあります

include "afxwin.h"

include "msclr\auto_gcroot.h"

using namespace System;

using msclr::auto_gcroot;

namespace A

{

    public ref class A
    {

    public:

        virtual bool Func();

        A();

        ~A();

        virtual bool Connect();

    protected:

        DWORD WINAPI threadConnect(void* pParam);

};

public class AHelper 
{

public:

    auto_gcroot A;

};

}

A.cpp には以下のコードがあります

// This is the main DLL file.

include "stdafx.h"
include "A.h"
include "string"
include "sstream"
include "stdlib.h"
include "strsafe.h"
include "windows.h"
include "tchar.h"
namespace A
{

    A::A()
    {
        m_FuncHandle = mpsNil;
    }
    A::~A()
    {

    }

    bool A::Func()
    {
        return true;
    }

    bool A::Connect() 
    {

        AHelper* AHelper;

        m_retVal = false;
        AHelper = new AHelper();

        AHelper->A = this;

        HANDLE Handle_Of_Thread = 0;

        DWORD dwThreadId;

        //DWORD WINAPI threadConnect(void* pParam);

        //If I declare the function declaration here I am getting

        //error LNK2001: unresolved external symbol "unsigned long __stdcall  threadConnect(void *)" (?threadConnect@@YGKPAX@Z)

        Handle_Of_Thread = CreateThread (NULL, 0, threadConnect, AHelper, 0, &dwThreadId);   // with this code I am getting

        //error C3867: 'A::A::threadConnect': function call missing argument list; use '&A::A::threadConnect' to create a pointer to member


        return m_retVal;
    }


    DWORD WINAPI A::threadConnect(void* pParam)
    {
         AHelper* AHelper = reinterpret_cast(pParam);
         //Here I need to call Func
         return 0;   
    }



}
4

1 に答える 1

0

アンマネージドスレッドの代わりにマネージド スレッドを使用して、マネージド型のメソッドを呼び出します。

gcnew Thread(gcnew ThreadStart(this, &A::threadConnect));

メソッド宣言を変更して、マネージ スレッドの予想されるシグネチャと一致させます。

void A::threadConnect()
{
    // No need for AHelper. The thread that's running will have a reference to
    // the 'this' object, so no need for a GCRoot to keep it alive.
}
于 2013-04-12T21:21:14.130 に答える