2014-09-04 1 views
0

Я пытаюсь создать простую программу, используя функцию CreateThread(). Мне нужно передать аргумент LPSTR в новую функцию потока внутри структуры pDataArray. Im, следуя примеру MSDN (MSDN CreateThread() Example).C++ CreateThread() Ошибка аргумента LPSTR Windows 7 (64)

typedef struct MyData { 
LPSTR val1; 
int val2; 
} MYDATA, *PMYDATA; 

Основная функция (CreateNewThread) получает переменную LPSTR command с примером текста «Привет всем» из другой функции и работает правильно и правильно вводит в структуры, но когда я пытаюсь отправить его в резьбовую функция (MyThreadFunction) возвращает много странных caracters, дамп памяти я supose:

DEBUG: Inside CreateThread string: hi all 
DEBUG: Before send to function: hi all 
DEBUG: Inside MyThreadFunction data: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ 
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ 
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ 
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ 
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ 
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ 
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠☻☻☻☻WinSock 2.0 

код функции CreateThread является:

int CreateNewThread(LPSTR command, int numThread) 
{ 
    printf("\nDEBUG: Inside CreateThread string: %s\n",command); 
    PMYDATA pDataArray[MAX_THREADS]; 
    DWORD dwThreadIdArray[MAX_THREADS]; 
    HANDLE hThreadArray[MAX_THREADS]; 

    // Allocate memory for thread data. 

    pDataArray[numThread] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
      sizeof(MYDATA)); 

    if(pDataArray[numThread] == NULL) 
    { 
     ExitProcess(2); 
    } 

    // Generate unique data for each thread to work with. 

    pDataArray[numThread]->val1 = command; 
    pDataArray[numThread]->val2 = 100; 

    printf("\nDEBUG: Before send to function: %s\n",pDataArray[numThread]->val1); 

    // Create the thread to begin execution on its own. 

    hThreadArray[numThread] = CreateThread( 
     NULL,       // default security attributes 
     0,        // use default stack size 
     MyThreadFunction,    // thread function name 
     pDataArray[numThread],   // argument to thread function 
     0,        // use default creation flags 
     &dwThreadIdArray[numThread]); // returns the thread identifier 


    if (hThreadArray[numThread] == NULL) 
    { 
     ErrorHandler(TEXT("CreateThread")); 
     ExitProcess(3); 
    } 
    return 0; 
} 

И код MyThreadFunction() является:

DWORD WINAPI MyThreadFunction(LPVOID lpParam){ 

PMYDATA pDataArray; 
pDataArray = (PMYDATA)lpParam; 
LPSTR data = pDataArray->val1; 
printf("\nDEBUG: Inside MyThreadFunction data: %s\n",data); 
return 1; 

} 

Может кто-нибудь сказать мне, что это правильный путь, чтобы отправить LPSTR переменную к резьбовому функции?

Спасибо за консультацию.

+0

И почему это помечено C#? – crashmstr

+0

Тег удален, извините: D – Ikary

ответ

3

Похоже, вы проходите мимо временного LPSTR до CreateNewThread(), поэтому к моменту выполнения MyThreadFunction() он уже удален. Например, это может произойти, если вы делаете что-то вроде этого:

CreateNewThread(std::string("hi all").c_str(), 0); 

или как это:

std::string f() { return "hi all"; } 
CreateNewThread(f().c_str(), 0); 
+0

Вы гений! ;) Я получал строку из сокета. Когда поток запускается, функция сокета сбрасывает все, включая переменную LPSTR. Большое спасибо! – Ikary