说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

多线程调用错误,找了两天没有解决了,各位大侠帮忙啊。(在线等!)

编辑:说三道四文库 发布时间:2018-08-17 06:08
HTML文档下载 WORD文档下载 PDF文档下载
偶用bcb调用进程函数 _beginthread。代码如下:
.h文件部分:
typedef struct tagTHREADPARMS{
      AnsiString netpath;
      AnsiString localpath;
}THREADPARMS;
/////////////////////////////////////////
cpp文件部分:
void __fastcall TForm2::downloadfile1(PVOID pParam){
         THREADPARMS* ptp=(THREADPARMS* )pParam;
         AnsiString netpath=ptp->netpath;
         AnsiString localpath=ptp->localpath;
         delete ptp;

        LPUNKNOWN pCaller;
        pCaller = NULL;
        DWORD dwResv = NULL;
        LPBINDSTATUSCALLBACK lpfnCB= NULL;
         HRESULT hRet=URLDownloadToFile(pCaller,netpath.c_str(),"c:\zimu.eos",dwResv,lpfnCB);
        if(hRet==S_OK) MessageBox(NULL,"yi xia zai !","",MB_OK);
        //else return 0;
}
//------------------------------------------------------------------------------
int __fastcall TForm2::getnetfile(AnsiString netpath,AnsiString localpath){
       THREADPARMS *ptp=new THREADPARMS;
       ptp->netpath=netpath;
       ptp->localpath=localpath;
       //HANDLE hThread;
       //hThread=
        _beginthread(downloadfile1,0,ptp);
       //if(hThread==NULL) return 0;
       //else
       return 1;
}
小弟自认为没有错误,可出现下面的错误
[C++ Error] Unit2.cpp(149): E2336 Pointer to overloaded function 'TForm2::downloadfile1' doesn't match 'void (*)(void *)'
[C++ Error] Unit2.cpp(149): E2342 Type mismatch in parameter '__start' (wanted 'void (*)(void *)', got 'int')
还请各位大侠帮忙!
将downloadfile1改为static函数或者全局函数。

static void __fastcall TForm2::downloadfile1(PVOID pParam){
         THREADPARMS* ptp=(THREADPARMS* )pParam;
         AnsiString netpath=ptp->netpath;
         AnsiString localpath=ptp->localpath;
         delete ptp;

        LPUNKNOWN pCaller;
        pCaller = NULL;
        DWORD dwResv = NULL;
        LPBINDSTATUSCALLBACK lpfnCB= NULL;
         HRESULT hRet=URLDownloadToFile(pCaller,netpath.c_str(),"c:\zimu.eos",dwResv,lpfnCB);
        if(hRet==S_OK) MessageBox(NULL,"yi xia zai !","",MB_OK);
        //else return 0;
}
这样吗??
不行啊,还是那两个错误!
你去看看static函数是怎样声明和定义的吧。
DWORD WINAPI downloadfile1(PVOID pParam)
不要写成
void __fastcall TForm2::downloadfile1(PVOID pParam)
是的,
我也遇到过类似的问题,
这些函数必须是全局的,调用约定必须是__stdcall(即WINAPI),才可以使用,不能是类的成员函数,
例如:在EnumWindows中提供的回调函数。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘