我的WIN2K+VC6.0居然用不了OpenThread(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwThreadId);编译报错:
D:\Microsoft Visual Studio\MyProjects\windows\ModifyTool\ModifyTool.cpp(115) : error C2065: 'OpenThread' : undeclared identifier可是MSDN上:
Requirements
Client: Requires Windows XP, Windows 2000 Professional, or Windows Me.
Server: Requires Windows Server 2003 or Windows 2000 Server.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.头文件已加入,可是没用,请大家试一下(只看输入OpenThread后有无参数提示即可)求教哪为前辈能帮我解决一下:
我在做游戏通用修改器需要中断线程(要线程句柄)
通过Thread32First/Thread32Next将线程的信息存入结构THREADENTRY32中
然后将该结构中的th32OwnerProcessID项与指定的进程的ID比较,
如果相同则该线程为指定进程的子线程,从而找到指定进程的线程句柄。进程,线程的连我都被说晕了,您明白了吗?
请赐教,谢谢,或者有什么其他办法教教我,谢谢。以下是我的函数,请指教//////////////////////////////////////////////////////////////////////////
//获得指定进程的线程句柄
//原理:
//通过Thread32First/Thread32Next将线程的信息存入THREADENTRY32结构pe中
//然后将该pe.th32OwnerProcessID项与指定的进程的ID比较,
//如果相同则该线程为指定进程的子线程,从而找到指定进程的线程句柄。
//////////////////////////////////////////////////////////////////////////
HANDLE GetThread(DWORD dwProcessID)
{
HANDLE hThread;
BOOL fOK;
THREADENTRY32 te = { sizeof(te) };
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
if (hSnapshot != INVALID_HANDLE_VALUE)
{
fOK = Thread32First(hSnapshot, &te);
for(;fOK;fOK = Thread32Next(hSnapshot,&te))
{
if(te.th32OwnerProcessID ==dwProcessID)
{
hThread = OpenThread(THREAD_SUSPEND_RESUME,FALSE,te.th32ThreadID);
return hThread;
}
}
}
}

解决方案 »

  1.   

    你的调用方法有问题:
    改了一下:应该这样:
    typedef HANDLE (*OPENTHREAD) (DWORD dwFlag,BOOL bUnknow,DWORD dwThreadId);
    HANDLE GetThread(DWORD dwProcessID)
    {
    HANDLE hThread;
    BOOL fOK;
    THREADENTRY32 te = { sizeof(te) }; OPENTHREAD lpfnOpenThread; HMODULE hDll=::LoadLibrary("Kernel32.dll");

    if (!hDll)
    {
                        return NULL;
    }
             lpfnOpenThread=(OPENTHREAD)::GetProcAddress(hDll,"OpenThread");
            
              HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
    if (hSnapshot != INVALID_HANDLE_VALUE)
    {
    fOK = Thread32First(hSnapshot, &te);
    for(;fOK;fOK = Thread32Next(hSnapshot,&te))
    {
    if(te.th32OwnerProcessID ==dwProcessID)
    {
    hThread = lpfnOpenThread(THREAD_SUSPEND_RESUME,FALSE,te.th32ThreadID);
                                         break;

    }
    }
                      ::FreeLibrary(hDll);
    }
              return hThread;
    }
      

  2.   

    对了,还有一个问题,需要修改
    在 "HANDLE" 后加 "WINAPI" :
    HANDLE WINAPI (*OPENTHREAD) (DWORD dwFlag,BOOL bUnknow,DWORD dwThreadId);
    或者修改编译器,变为__stdcall。
    否则,在win2000 pro下有可能运行到::FreeLibrary(hDll)这里不是自动退出就是执行非法操作
      

  3.   

    好象还是不行啊,考个VC7的Winbase.h和Windows.h来行吗?
      

  4.   

    我曾经用过一种方法
    我将SDK2003的kernel32对应lib文件(好几个)拷到VC6下,将Windows.h和Winbase.h打开(忘了是这两个文件的哪个了),有DWORD WINAPI ……定义函数的地方看到了吧,当然不存在OpenThread这个函数了;将SDK2003文件里对OpenThread这个函数的定义粘过去——要注意,不要乱粘,要按字母顺序粘,我记得在OpenProcess之后。
    我当年费了N多精力和智慧才搞好的,绝对可用。