CreateThread将long传递给lpParameter

CreateThread passing long to lpParameter

本文关键字:lpParameter long CreateThread      更新时间:2023-10-16

编译器在第3行显示"非法间接"。IDE规定"表达式必须是指向完整对象类型的指针"

001 DWORD WINAPI MyCallbackFunction( LPVOID lpvParam )
002 {
003    long value = (long) *lpvParam;
004    ...
005    return 0;
006 }
007
008 BOOL StartMyThread( long value )
009 {
010    DWORD dwThreadId;
011    BOOL result = FALSE;
012    HANDLE hThread = NULL;
013    hThread = CreateThread(NULL, 0, MyCallbackFunction, &value, NULL, &dwThreadId );
014    result = (NULL == hThread);
015    CloseHandle( hThread );
016    return result;
017 }

如果我把第3行改成这样,它可以编译,但是崩溃了…

long value = (long) lpvParam;

您正在尝试遵从void*指针,这是不允许的。您必须首先将其强制转换为另一种指针类型。由于参数是指向long的指针,因此您需要这样做:

long *value = (long*) lpvParam;

或者,如果线程不需要访问原始变量:

long value = * (long*) lpvParam;
Seth是对的。原来的变量将在线程实际开始运行时消失。如果您试图将其值传递给线程,请这样做:
// notice the '&' operator is gone now...
hThread = CreateThread(NULL, 0, MyCallbackFunction, (LPVOID)value, NULL, &dwThreadId );
...    
long value = (long) lpvParam;

你给出了一个指向局部变量的指针,该变量可以被线程运行的类型销毁。最好在调用CreateThread时将long转换为LPVOID,然后在MyCallbackFunction内将其转换回long(注意没有指针解引用发生)。