Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: CeroX901 en 17 Octubre 2011, 18:32 pm



Título: Error creando Thread (CreateThread)
Publicado por: CeroX901 en 17 Octubre 2011, 18:32 pm
Hola, estoy intentando crear un Thread desde una Clase pero no logro hacerlo ya que me sale un error que dice:

(http://freakbox.co.cc/img/error.jpg)

previamente tengo definida la funcion en private: dentro de la clase:

Código
  1. DWORD WINAPI Thread_Listen(LPVOID lpParam);

y claramente el método usado está definido de esta manera:

Código
  1. DWORD WINAPI S_Server::Thread_Listen(LPVOID lpParam) {
  2. do {
  3. cl_[0] = accept(l_, NULL, NULL);
  4. if (cl_[0] == INVALID_SOCKET) {
  5. printf("Error_ACCEPT::%ld\n", WSAGetLastError());
  6. }
  7. noClients++;
  8. } while (true);
  9.    return 0;
  10. }

Cuando intento compilar me sale lo siguiente:

Citar
error C3867: 'S_Server::Thread_Listen': falta la lista de argumentos de la llamada a la función; utilice '&S_Server::Thread_Listen' para crear un puntero al miembro

PD: Trabajo bajo Visual Studio 2010 Professional

Espero que me ayuden... Salud2  ;D


Título: Re: Error creando Thread (CreateThread)
Publicado por: Queta en 17 Octubre 2011, 19:00 pm
¿Y por qué no pruebas a hacer lo que te dice el error?

En cualquier caso, sería mejor que depurases.

http://msdn.microsoft.com/en-us/library/b0x1aatf.aspx (http://msdn.microsoft.com/en-us/library/b0x1aatf.aspx)


Título: Re: Error creando Thread (CreateThread)
Publicado por: CeroX901 en 17 Octubre 2011, 19:56 pm
Intenté con la siguiente linea:

Código
  1. HANDLE hThread = CreateThread(NULL, 0, &S_Server::Thread_Listen, NULL, 0, &dwThreadId);

Me aparece el siguiente error:

Citar
error C2664: 'CreateThread' : no se puede convertir el parámetro 3 de 'DWORD (__stdcall S_Server::* )(LPVOID)' a 'LPTHREAD_START_ROUTINE'

Sigo con la duda...


Título: Re: Error creando Thread (CreateThread)
Publicado por: Queta en 17 Octubre 2011, 20:58 pm
Pues en teoría, tu primer código, debería funcionar.

Intenta depurar, repito; además que no tenemos suficiente código y puedes probar de solucionarlo con las opciones que vienen en la página que te dí.


Título: Re: Error creando Thread (CreateThread)
Publicado por: CeroX901 en 17 Octubre 2011, 21:07 pm
Logré solucionarlo de la siguiente manera   :rolleyes:

Arriba en private: lo modifiqué así:

Código
  1. DWORD __stdcall Thread_Listen();

Cuando crea el proceso lo arreglé de esta manera:

Código
  1. DWORD ThreadId;
  2. DWORD (__stdcall S_Server::*pmfnMember)() = &S_Server::Thread_Listen;
  3. HANDLE hthread=CreateThread(NULL, 0, * (LPTHREAD_START_ROUTINE *) &pmfnMember, this, 0, &ThreadId);

y el método donde ejecuta el código quedó así:

Código
  1. DWORD S_Server::Thread_Listen() {
  2. do {
  3. cl_[0] = accept(l_, NULL, NULL);
  4. if (cl_[0] == INVALID_SOCKET) {
  5. printf("Error_ACCEPT::%ld\n", WSAGetLastError());
  6. }
  7. noClients++;
  8. } while (true);
  9.    return 0;
  10. }

Me sirvió de ayuda la siguiente pagina: http://www.pocketpcjunkies.com/Uwe/Forum.aspx/wince-vc/2935/Threads-on-class (http://www.pocketpcjunkies.com/Uwe/Forum.aspx/wince-vc/2935/Threads-on-class)

Espero que para los que tengan el mismo problema les ayude... Salud2! y Gracias! :D


Título: Re: Error creando Thread (CreateThread)
Publicado por: Queta en 17 Octubre 2011, 21:40 pm
Logré solucionarlo de la siguiente manera   :rolleyes:

Arriba en private: lo modifiqué así:

Código
  1. DWORD __stdcall Thread_Listen();

__stdcall es lo mismo que WINAPI. Está declarada en WinDef.h:

Código
  1. #define WINAPI __stdcall

Enhorabuena por haberlo solucionado :D.


Título: Re: Error creando Thread (CreateThread)
Publicado por: Eternal Idol en 17 Octubre 2011, 23:19 pm
Muy interesante y simple de implementar el hack la verdad, no lo conocia.


Título: Re: Error creando Thread (CreateThread)
Publicado por: CeroX901 en 18 Octubre 2011, 01:03 am
__stdcall es lo mismo que WINAPI. Está declarada en WinDef.h:

Código
  1. #define WINAPI __stdcall

Enhorabuena por haberlo solucionado :D.

Si me di cuenta... Gracias...  ;)