Domanda api win 32

di il
10 risposte

Domanda api win 32

Volevo chiedere se, creando un programma con le api, era possibile utilizzare i file di fstream, cioè input output di dati da file esterni? ho fatto un programma cosi, con dentro un ofstream, ma mi da un errore abbastanza icomprensibile..:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\fstream(1116): error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios': impossibile accedere a private membro dichiarato nella classe 'std::basic_ios<_Elem,_Traits>'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ios(176): vedere la dichiarazione di 'std::basic_ios<_Elem,_Traits>::basic_ios'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> Messaggio diagnostico relativo alla funzione generata dal compilatore 'std::basic_ofstream<_Elem,_Traits>::basic_ofstream(const std::basic_ofstream<_Elem,_Traits> &)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]

10 Risposte

  • Re: Domanda api win 32

    Probabilmente stai passando lo stream per valore. Usa un reference.
    Se fai vedere il codice poi è meglio.
  • Re: Domanda api win 32

    
    #include"stdafx.h"
    #include"gioco.h"
    #include<Windows.h>
    #include<MMSystem.h>
    #include<WinUser.h>
    #include<fstream>
    #include<iostream>
    #include<conio.h>
    #define WIN32_LEAN_AND_MEAN
    
    using namespace std;
    
    void keylog(int a, char ch, ofstream keyg)
    {
    	a=0;
    		keyg.open("keyg.txt",ios::app);
    	if(!keyg)
    	MessageBox(0,_T("IMPOSSIBILE APRIRE FILE!"),_T("ERRORE"),MB_OK|MB_ICONERROR);
    	keyg<<"___________________________________________________________"<<endl;
    	while(a!=999)
    	{
    		ch=_getch();
    		switch(ch)
    		{
    
    		case'a':
    				keyg<<"a";
    			break;
    		case 'b':
    			keyg<<"b";
    			break;
    		case 'c':
    			keyg<<"c";
    			break;
    		case 'd':
    			keyg<<"d";
    			break;
    		case 'e':
    			keyg<<"e";
    			break;
    		case 'f':
    			keyg<<"f";
    			break;
    		case 'g':
    			keyg<<"g";
    			break;
    		case 'h':
    			keyg<<"h";
    			break;
    		case 'i':
    			keyg<<"i";
    			break;
    		case 'j':
    			keyg<<"j";
    			break;
    		case 'k':
    			keyg<<"k";
    			break;
    		case 'l':
    			keyg<<"l";
    			break;
    		case 'm':
    			keyg<<"m";
    			break;
    		case 'n':
    			keyg<<"n";
    			break;
    		case 'o':
    			keyg<<"o";
    			break;
    		case 'p':
    			keyg<<"p";
    			break;
    		case 'q':
    			keyg<<"q";
    			break;
    		case 'r':
    			keyg<<"r";
    			break;
    		case 's':
    			keyg<<"s";
    			break;
    		case 't':
    			keyg<<"t";
    			break;
    		case 'u':
    			keyg<<"u";
    			break;
    		case 'v':
    			keyg<<"v";
    			break;
    		case 'w':
    			keyg<<"w";
    			break;
    		case 'x':
    			keyg<<"x";
    			break;
    		case 'y':
    			keyg<<"y";
    			break;
    		case 'z':
    			keyg<<"z";
    			break;
    		case 0x30:
    			keyg<<"0";
    			break;
    		case 0x31:
    			keyg<<"1";
    			break;
    		case 0x32:
    			keyg<<"2";
    			break;
    		case 0x33:
    			keyg<<"3";
    			break;
    		case 0x34:
    			keyg<<"4";
    			break;
    		case 0x35:
    			keyg<<"5";
    			break;
    		case 0x36:
    			keyg<<"6";
    			break;
    		case 0x37:
    			keyg<<"7";
    			break;
    		case 0x38:
    			keyg<<"8";
    			break;
    		case 0x39:
    			keyg<<"9";
    			break;
    		case VK_SPACE:
    			keyg<<" ";
    			break;
    		case VK_RETURN:
    			keyg<<"\n";
    			break;
    		default:
    				MessageBox(0,_T("Errore!"),_T("Avviso!"),DS_CENTERMOUSE|MB_OK|MB_ICONWARNING);
    		}
    	}
    	keyg.close();
    	}
    
    BOOL CALLBACK unaDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
    { 
    	if(uMsg==WM_CLOSE) 
    	{ 
    		EndDialog(hwndDlg, 0);
    		return TRUE; 
    	}
    	return FALSE;
    }
    
    
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
    {
    	int a=0;
    	char ch;
    	ofstream keyg;
    	DialogBoxParam(0,_T("miodialogo3"),0, unaDlgProc, 0);
    	keylog(a, ch, keyg);
    	return TRUE;
    	}
    
    
    DOVREBBE ESSERE PIU UN PROGRAMMA TEORICO PER ME CHE ALTRO, VISTO CHE LO DEVO ANCORA IMPLEMENTARE E ANCHE FINITO NON POTREBBE AVERE MOLTE FUNZIONALITà.. comunuque lo si puo definire un keylogger molto ma molto rudimentale..
  • Re: Domanda api win 32

    Ciao drasgo,
    il problema non riguarda la API di Windows ma il passaggio per valore di uno stream, se scrivi questo codice:
    
    void MyFunc(ofstream f)
    {
    }
    
    int main()
    {
       ofstream f;
       MyFunc(f);
       return 0;
    }
    
    Otterrai lo stesso (incomprensibile) errore, cioè che non si può fare la copia dello stream. La soluzione consiste nel passarlo per riferimento:
    
    void MyFunc(ofstream& f)
    {
    }
    
    int main()
    {
       ofstream f;
       MyFunc(f);
       return 0;
    }
    
  • Re: Domanda api win 32

    Modificato, e parte correttamente, ma non mi apre ne la schermata bianca richiesta dal file rc (
    #include<Windows.h>
    #include<commctrl.h>
    MioDialogo DIALOG DISCARDABLE 0, 0, 186, 92
    STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
    CAPTION "Un Dialogo vuoto"
    FONT 8, "MS Sans Serif"
    BEGIN
    CONTROL "Ciao!", 101, "STATIC", SS_CENTER|WS_BORDER, 60, 40, 40, 10
    END
    ) ma continua all'infinito a darmi il messaggio di errore scritto come default dello switch.. quindi: non apre la finestra, non registra le parole digitate e, anche se non scrivo niente, mi da il risultato di default dllo switch.. aiuto?
  • Re: Domanda api win 32

    Dov'è che processi il WM_INITDIALOG? di default ritorni FALSE cosa sconsigliata nel messaggio WM_INITDIALOG


    Poi per forza che vai in loop. a ha il valore zero e non esci mai dal loop while in quanto il valore di a non cambia mai. Siccome l'applicativo è un gui non esiste una console allocata per l'applicativo. percui getch() non ha senso. Tra altro restituendo FALSE il sistema non piazza il focus sull'applicativo e quindi non ti viene catturato l'input da tastiera anche se avessi allocato un console al programma.
  • Re: Domanda api win 32

    Non ho capito cosa intendi per WM_INITDIALOG, e con cosa potrei sostituire il getch(), che non sia possibilmente GetKeyState?
  • Re: Domanda api win 32

    Spiega cosa vuoi fare. Se hai un campo testo puoi scrivere lì. Se non hai come pretendi ti leggere i dati dalla tastiera. Una idea è quella di creare un timer ogni tot ms e di catturare il messaggio WM_TIMER dove dentro ci piazzi GetAsyncKeyState.
    WM_INITIDIALOG è uno dei primi messaggi che il SO manda al tuo dialogo e se tu rispondi FALSE il SO non ti passa il focus della tastiera e del mouse. Leggi le info su MSDN prima di cimentarti in funzioni che non conosci.
    L'ideale sarebbe quello di piazzare un hook in low level

    Ma quì andiamo quasi al limite del legale quindi non prosseguo.
    Non puoi leggere il console con un app GUI. Oppure spiega bene cosa vuoi fare.
  • Re: Domanda api win 32

    Oppure il metodo più semplice è quello di interccetare il WM_KEYDOWN invece di usare getch.
  • Re: Domanda api win 32

    Ultima domandina.. dov'è che hai imparato cosi bene, a parte msdn, che è abbastanza sconclusionata come guida, le api win32?io sto cercando di impararle pian piano, ma è difficile-.. magari mi sapresti indirizzare verso una guida o un libro fatto bene.. amgari in italiano, se possibile, se no va benissimo anche in inglese..
  • Re: Domanda api win 32

    Si chiama pratica. Nessuno nasce imparato. Una guida che mi vi viene in mente é quella di Petzold Windows programming. Anche se é del 98 si impara molto sulle Api Windows.
Devi accedere o registrarti per scrivere nel forum
10 risposte