Visual C++ FAQ
Страница 8.


 Как удалить .exe-файл из самого себя?
#include <windows.h>
#include <stdio.h>

void DelSelf(void)
{
 char modulename[MAX_PATH];
 char batfile[MAX_PATH];
 char batlines[MAX_PATH*4];
 LPSTR tempdir;
 char Buf[MAX_PATH];

 GetModuleFileName(NULL,modulename,MAX_PATH);

 tempdir = ((GetEnvironmentVariable(TEXT("TEMP"),
 Buf, MAX_PATH) > 0) ? Buf : NULL);

 strcpy(batfile,tempdir);
 strcat(batfile,"\\");
 strcat(batfile,"delself.bat");
 strcpy(batlines,"@echo off\n:try\ndel ");
 strcat(batlines,modulename);
 strcat(batlines,"\nif exist ");
 strcat(batlines,modulename);
 strcat(batlines," goto try\n");
 strcat(batlines,"del ");
 strcat(batlines,batfile);

 DWORD NOfBytes;
 HANDLE hbf= CreateFile(batfile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ
| FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 WriteFile(hbf,batlines,strlen(batlines),&NOfBytes, NULL);
 CloseHandle(hbf);

 STARTUPINFO         si;
 PROCESS_INFORMATION pi;
 ZeroMemory( &si, sizeof(si) );
 si.cb = sizeof(si);
 si.wShowWindow = SW_HIDE;
 si.dwFlags = STARTF_USESHOWWINDOW;

 CreateProcess(
         NULL,
         batfile,
         NULL,
         NULL,
         FALSE,
         IDLE_PRIORITY_CLASS|DETACHED_PROCESS,
         NULL,
         NULL,
     &si,
     &pi);

}
void main()
{
 DelSelf();
}
Как изменить разрешение экрана?
DEVMODE dm;

ZeroMemory(&dm,sizeof(DEVMODE));
dm.dmSize=sizeof(DEVMODE);
dm.dmBitsPerPel=16;
dm.dmPelsWidth=800;
dm.dmPelsHeight=600;
dm.dmDisplayFrequency=60;
dm.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;

ChangeDisplaySettings(&dm,CDS_UPDATEREGISTRY);

 

1. Почему я получаю unresolved external error (LNK2001) в main() когда пытаюсь сделать release версию ATL проекта?

Release версия ATL проектов содержит оптимизацию, по средствам чего проект не связан с C runtime library (CRT) чтобы уменьшить размер Вашего исполняемого модуля. Если Вы используете функции из CRT (например, функции манипуляции со строками) или классы из библиотеки C++, то Вам необходимо линковать проект с CRT.

В опциях проекта, в закладке C/C++ выберите категорию Preprocessor. Удалите директиву _ATL_MIN_CRT из определений препроцессора, тем самым удалив оптимизацию.

Для получения более детальной информации, в MSDN задайте поиск по слову "lnk2001 atl".

 

2. Как сделать новую строчку в многострочном edit ?

Для создания новой строки используется "\r\n". Если Вы будете использовать "\r" или "\n" или даже "\n\r",
то в EDIT-e вместо переноса на следующую строку будут видны квадратики.

 

3. Как сделать, чтобы диалог не закрывался при нажатии пользователем Enter или Esc?

Для начала разберёмся, почему диалог закрывается, даже если убрать кнопки OK и Cancel. CDialog имеет две специальных виртуальных функции, OnOK() и OnCancel(), которые вызываются когда пользователь нажимает клавиши Enter или Esc соответственно. CDialog содержит функцию EndDialog(), которая собственно и закрывает диалог. Так как она относится к функциям специального назначения, то она не присуствует в диалоговой секции BEGIN_MESSAGE_MAP/END_MESSAGE_MAP, и должна быть переопределена по-другому, в отличие от обычных обработчиков нажатия на кнопки.

Если у Вас есть кнопки с идентификаторами IDOK и IDCANCEL, то можно воспользоваться Визардом (ClassWizard) для добавления обработчиков BN_CLICKED для этих кнопок, и они будут делать необходимые действия для OnOK() и OnCancel(). Если у Вас нет кнопок с этими ID, то можно вручную добавить эти виртуальные функции. В заголовочном файле диалогового класса:

class CMyDialog : public CDialog
{
// ...

                                     // Generated message map functions
                                     //{{AFX_MSG(CMyDialog)
                                     virtual void OnOK();
                                                                                                                                                                                                         virtual void OnCancel();
                                     //}}AFX_MSG
       DECLARE_MESSAGE_MAP()
};

А затем в соответствующем .CPP файле:

void CMyDialog::OnOK() 
{
}

void CMyDialog::OnCancel()
{
}

Теперь обработчики не будут вызывать EndDialog() и, соответственно диалог не будет закрываться.

 

 
« Предыдущая статья