[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf
     
  2. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    810
    Likes Received:
    414
    Reputations:
    62
    не работают полосы прокрутки.

    доброго времени суток.
    очень нужно реализовать функцию открытия txt файлов и вывода содержимого файлов на экран в отдельном окне.
    вот что набросал уже:

    класс окна для вывода в него содержимого файла:
    Code:
    class COpenWnd:public CFrameWnd
    {
    public:
    	COpenWnd(CWnd *wnd);
    };
    COpenWnd::COpenWnd(CWnd *wndPerent)
    {
    CRect rectWnd(25,25,700,500);
    Create(NULL, "Opened file", WS_OVERLAPPEDWINDOW | WS_HSCROLL |WS_VSCROLL , rectWnd, wndPerent, NULL);
    }
    
    и функция, которая открывает файл и выводит его содержимое в окно:
    Code:
    void CMyFrameWin::OnOpen()
      {
    	CString m_Text, path;
    	CFileDialog dlgOpen(TRUE, "txt","", 
    	OFN_HIDEREADONLY, "BLOKNOT (*.txt)| *.txt| VISUAL C++ (*.cpp)| *.cpp| ALL Files(*.*)|*.*|", this);
    
    	if(dlgOpen.DoModal()==IDOK)
    	{
    		CStdioFile File(dlgOpen.GetPathName(), CFile::modeRead| CFile::typeBinary);
    		CString & ref=m_Text;
    		path=dlgOpen.GetPathName();
    		COpenWnd *OpenWnd=new COpenWnd(this);
    		OpenWnd -> ShowWindow(SW_SHOWNORMAL);
    		OpenWnd -> UpdateWindow();
    		CClientDC dc(OpenWnd);
    		int y=30;
    CFont l_font; 
    l_font.CreatePointFont(150,"Lucida Console"); 
    CFont* l_old_font = dc.SelectObject(&l_font);
    		dc.TextOut(10,10,path);
    dc.SelectObject(l_old_font);
    
    		while (File.ReadString(ref)!=NULL)
    		{
    CFont l_font; 
    l_font.CreatePointFont(150,"Lucida Console"); 
    CFont* l_old_font = dc.SelectObject(&l_font);
        
    		dc.SetTextColor(RGB(y*10,y+19,y+50));
    		dc.TextOut(30,y,m_Text, strlen(m_Text)-1);
    		y=y+45;
    		dc.SelectObject(l_old_font); 
    		}
    	}
      }
    

    проблема: никак не получается сделать рабочие полосы прокрутки, чтоб когда в файле большой текст, то можно было с помощью полос прокручивать и видеть все содержимое файла.
    помогите пожалуйста новичку.
    большое спасибо! ;)
     
    _________________________
  3. _empty

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

    Joined:
    22 Mar 2008
    Messages:
    62
    Likes Received:
    17
    Reputations:
    5
    А зачем ты текст через dc отрисовываешь? Ты же используешь стандартные компоненты, поэтому используй Editbox или его производные, какой средой пользуешься?
     
    1 person likes this.
  4. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    810
    Likes Received:
    414
    Reputations:
    62
    спасибо за совет. в общем принял во внимание и вот к чему дошел:
    http://www.gfs-team.ru/?act=articles&pact=122
    только вот у меня это отдельное диалоговое окно в приложении, которое открывается по нажатии ОПЕН.
    1) создал класс class COpenDialog : public CDialog
    Code:
    class COpenDialog : public CDialog
    {
    public:
    	afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message );
    	COpenDialog(CWnd* pParent = NULL);  
    		enum { IDD = IDD_DIALOG_OPEN};
    	CEdit    m_EditOpen;
    	CEdit    m_bOpen;
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    
    protected:
    	virtual void OnOK();
    	virtual void OnCancel();
    	virtual BOOL OnInitDialog();
    	afx_msg void OnPaint();
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnStnClickedBitmap1();
     };
    COpenDialog::COpenDialog(CWnd* pParent)
    	: CDialog(COpenDialog::IDD, pParent)
    {
    }
    void COpenDialog::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_OPEN_PATH, m_EditOpen);
    	DDX_Control(pDX, IDC_OPEN_TEXT, m_bOpen);
    }
    
    BEGIN_MESSAGE_MAP(COpenDialog, CDialog)
    	ON_WM_PAINT()
    	ON_WM_SETCURSOR()
    	ON_STN_CLICKED(IDB_BITMAP1, &COpenDialog::OnStnClickedBitmap1)
    END_MESSAGE_MAP()
    
    ///////////////////////////////////////////////////////////////////////////
    BOOL COpenDialog:: OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
    {
    [COLOR=DarkOrange]----bla bla bla[/COLOR]
    }
    /////////////////////////////////////////////////////////////////////////////
    void COpenDialog::OnPaint() 
    {
    [COLOR=DarkOrange]----bla bla bla[/COLOR]
    }
    void COpenDialog::OnOK() 
    
    {
    	CString m_EditText;
            // TODO: Add your control notification handler code here
            CString fname; //Переменная для хранения имени файла
            CFile file;    //обьект класса CFile
            char ch[1024]; //Буффер для чтения данных из файла
            if(!OpenRead) //Если OpenRead=false то показываем диалог открытия файлов
            {
                    CFileDialog fDialog(TRUE);
                    fDialog.DoModal();
                    m_EditOpen.SetWindowText(fDialog.GetPathName());
                    m_bOpen.SetWindowText("Read");
                    OpenRead = true;
            }
            else 
            {
                    m_EditOpen.GetWindowText(fname); //Получаем имя файла
                    if(!file.Open(fname, CFile::modeRead, NULL)) //Открываем его
                    {
                            AfxMessageBox("Cannot open file");
                            return;
                    }
                    file.Read(&ch, 1024); //Читаем 1024 байт
                    [B][COLOR=Red]//m_EditText.SetWindowText(ch);[/COLOR][/B]
                    file.Close(); //Закрываем файл
                    m_bOpen.SetWindowText("Open");//Меняем текст кнопки
                    OpenRead = false;
            }
    
    
    	CDialog::OnOK();
    }
    void COpenDialog::OnCancel() 
    {
    	CDialog::OnCancel();
    }
    
    BOOL COpenDialog::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
    	m_EditOpen.SetWindowText(CString("файл"));
    	m_bOpen.SetWindowText(CString("содержимое"));
    	UpdateData(false);
    	OpenRead = false;
    	return TRUE;
    }
    
    и подправил функцию ОПЕН с мейнфрейма, чтоб она вызывала диалог:
    Code:
    void CMyFrameWin::OnOpen()
      {
    
        COpenDialog dialog;		
    	if(dialog.DoModal()==IDOK);
     }
    
    при компиле имеем ошибку в строчке
    m_EditText.SetWindowText(ch);
    которую устранил пока лиш тем что закомментировал... :(
    суть ошибки :
    Code:
     [B][COLOR=Red]'SetWindowTextA' : is not a member of 'ATL::CStringT<BaseType,StringTraits>'[/COLOR][/B] 
    в чем собственно трабла у как устранить данную проблему? :confused:
    среда разработки - Visual Studio 2008
    Спасибо всем кто откликнется.

    --------------------EDIT---------------------

    Спасибо за консультацию по аське groupby
    проблема была в:
    "m_EditText иметт тип CString
    а должен иметь тип CEdit"
    --------------------EDIT---------------------
     
    _________________________
    #2044 NetSter, 20 Dec 2008
    Last edited: 21 Dec 2008
  5. criz

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

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Всем привет. Проблемка тут возникла. Имеется следующий код:
    Code:
    if(CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 4) == INVALID_HANDLE_VALUE)
    {
          ShowMessage(IntToStr(GetLastError()));
    }
    
    Получаю ошибку 8: Недостаточно памяти для обработки команды.
    Как решить эту проблему? С другими процессами все норм, а вот с этим нет
     
    #2045 criz, 21 Dec 2008
    Last edited: 21 Dec 2008
  6. groundhog

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

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    В исходнике так же?
     
  7. criz

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

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    сорри, опечатка :)
     
  8. groundhog

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

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    А почему th32ProcessID равен 4 при вызове?
     
  9. criz

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

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    мне нужен процесс по имени System :)
     
  10. n4e/\@

    n4e/\@ Elder - Старейшина

    Joined:
    6 May 2008
    Messages:
    138
    Likes Received:
    17
    Reputations:
    0
    Есть элемент CWebBrowser2, как в него можно задать куки из программы. т.е есть страница куда без кукисов или логина и пароля не попадешь, куки я как раз знаю. Я так понимаю мне их надо просто прописать в ие, но как?
     
  11. groundhog

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

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    criz, ты хочешь получить список всех процессов в системе что ли?
     
  12. criz

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

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Нет, мне надо получить список модулей/библиотек процесса System.
     
  13. groundhog

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

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    criz, больше чем уверен, что ты намутил что-то с обработкой ошибок. Скорее всего тебе возвращается отказ в доступе, а не ошибка по памяти. Попробуй скомпилять этот кусок кода:

    Code:
    #include <windows.h>
    #include <tlhelp32.h>
    
    int main (int argc, char* argv[]) {
    	HANDLE hSnapshot;
    	LPVOID lpMsgBuf;
    
    	hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 4);
    	if (hSnapshot == INVALID_HANDLE_VALUE) {
    		FormatMessage( 
    			FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    			FORMAT_MESSAGE_FROM_SYSTEM | 
    			FORMAT_MESSAGE_IGNORE_INSERTS,
    			NULL,
    			GetLastError(),
    			0,
    			(LPTSTR)&lpMsgBuf,
    			0,
    			NULL
    		);
    		MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK | MB_ICONERROR);
    		LocalFree(lpMsgBuf);
    	}
    
    	return 0;
    }
     
    #2053 groundhog, 22 Dec 2008
    Last edited: 22 Dec 2008
  14. criz

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

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    groundhog, я тоже подумывал насчет нехватки прав... Вот код, который, как мне показалось, "дает" права:
    Code:
    void chPriv(int res)
    {
           	HANDLE hToken;
           	if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
           	{
                   	TOKEN_PRIVILEGES priv;
           	       	priv.PrivilegeCount = 1;
           	       	LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &priv.Privileges[0].Luid);
           	        if(res)
                   	     priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
           	       else
                   	     priv.Privileges[0].Attributes = 0;
           	       	AdjustTokenPrivileges(hToken, 0, &priv, sizeof(priv), NULL, NULL);
                   	CloseHandle(hToken);
    }
    }
    
    Есть ли здесь ошибка?
    Если не использовать эту функцию, то вылетает ошибка "не хватает прав", а если использовать - "не хватает памяти".
     
    #2054 criz, 22 Dec 2008
    Last edited: 22 Dec 2008
  15. groundhog

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

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Ну на первый взгляд - всё верно. Покажи весь исходник, трудно говорить о проблеме на словах. Чтобы понять в чём проблема нужно оттрассировать исходник, так что выложи где-нить, если не хочешь публично светить...
     
  16. criz

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

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Вот, весь код:
    Code:
    #include <stdio.h>
    #include <windows.h>
    #include <tlhelp32.h>
    
    #define dwPID 4
    
    void chPriv(int res);
    
    int main(int argc, char* argv[])
    {
            MODULEENTRY32 mod;
            LPVOID lpMsgBuf;
    
            HANDLE snap = INVALID_HANDLE_VALUE;
    
            chPriv(1);
            snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
            if(snap == INVALID_HANDLE_VALUE)
            {
                    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
    			FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
    			NULL, GetLastError(), 0, (LPTSTR)&lpMsgBuf, 0, NULL);
                    MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK | MB_ICONERROR);
    		LocalFree(lpMsgBuf);
    
                    return 1;
            }
            mod.dwSize = sizeof( MODULEENTRY32 );
            if( !Module32First(snap, &mod) )
            {
                    printf("Module32First: %d\n", GetLastError());
                    CloseHandle(snap);
                    return 1;
            }
            do
            {
                    printf("%s\t", mod.szModule);
                    printf("0x%X\n", mod.modBaseAddr);
            }
            while( Module32Next(snap, &mod));
            chPriv(0);
            CloseHandle(snap);
            getchar();
            return 0;
    }
    
    void chPriv(int res)
    {
           	HANDLE hToken;
           	if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
           	{
                   	TOKEN_PRIVILEGES priv;
           	       	priv.PrivilegeCount = 1;
           	       	LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &priv.Privileges[0].Luid);
           	        if(res)
                   	     priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
           	        else
                   	     priv.Privileges[0].Attributes = 0;
           	       	AdjustTokenPrivileges(hToken, 0, &priv, sizeof(priv), NULL, NULL);
                   	CloseHandle(hToken);
    }
    }
    
     
  17. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    810
    Likes Received:
    414
    Reputations:
    62
    Ребята, помогите пожалуйста... голова уже забита..
    есть функция, которая считывает данные с файла и передает их в эдитбокс.
    по дефолту там считывает 1024 байта. не больше и не меньше.
    как в MFC получить длину файла и считывать такое количество байт, которое нужно, а не строго только 1024..
    вот код:
    Code:
    [B]
    void COpenDialog::OnOpen() 
    {
    	   CString fname; //Переменная для хранения имени файла
            CFile file;    //обьект класса CFile
            [COLOR=Red]char ch[1024]; //Буффер для чтения данных из файла[/COLOR]
            if(!OpenRead) //Если OpenRead=false то показываем диалог открытия файлов
            {
                    CFileDialog fDialog(TRUE);
                    fDialog.DoModal();
                    m_EditOpen.SetWindowText(fDialog.GetPathName());
                    m_bOpen.SetWindowText("Read");
                    OpenRead = true; 
            }
            else 
            {
                    m_EditOpen.GetWindowText(fname); //Получаем имя файла
    		if(!file.Open(fname, CFile::modeRead, NULL)) //Открываем его
                    {
                            AfxMessageBox("Cannot open file");
                            return;
                    }
    		[COLOR=Red]file.Read(&ch, 1024); //Читаем 1024 байт[/COLOR]
                    m_EditText.SetWindowText(ch);
    		file.Close(); //Закрываем файл
    		m_bOpen.SetWindowText("Open");//Меняем текст кнопки
                    OpenRead = false;
    		}
    }[/B]
    
    никак не могу вкурить как сюда прилепить CFile::GetLength.. а завтра нужно сдать..
    кто нить на свежую голову посмотрите что там можно сделать. спасибо, друзья.
     
    _________________________
  18. ronald

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

    Joined:
    27 Mar 2008
    Messages:
    252
    Likes Received:
    42
    Reputations:
    6
    под рукой нету компилятора, попробуй подставлять CFile вроде как-то так:
    file.Read(&ch, CFile);
    ногами не пинать, не уверен на 55 персентов.
    (имеется ввиду то, что ты не можеш подставить)
     
    #2058 ronald, 22 Dec 2008
    Last edited: 22 Dec 2008
    1 person likes this.
  19. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    810
    Likes Received:
    414
    Reputations:
    62
    не так не катит... вот что я пробовал, получить сразу длину в самой функции считывания.
    file.Read(&ch, CFile::GetLength(fDialog.GetPathName()));
    но тоже не катит.. хз.. пробую дальше.
    кто что подскажет? спс.
     
    _________________________
    1 person likes this.
  20. _antony

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

    Joined:
    16 Jul 2008
    Messages:
    80
    Likes Received:
    43
    Reputations:
    0
    а чем GetFileSize не устраивает? http://msdn.microsoft.com/en-us/library/aa364955(VS.85).aspx
     
    1 person likes this.
Thread Status:
Not open for further replies.