Парнёры: http://repetitors.ws ,http://repetitor.ws , http://moscowrepetitors.org.ru, http://moscowrepetitor.org.ru, http://mosrepetitors.org.ru

образовательный форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » образовательный форум » C++ » F A Q


F A Q

Сообщений 1 страница 10 из 10

1

Вот создал некоторый список вопросов, обсужденных ранее, с примерчиками их решения. Описания ф-ций, использованных в примерах, смотрим в MSDN. Список будет увеличиваться по мере расширения нашего раздела :)
Итак, вопросы:

Вопрос №0
Как из 1) double, 2) int перевести данные в обыкновенную строку?
Вопрос №1
Написал я прогу на C++ Builder'е 5.0, а она при запуске на любой машине, где этот Билдер не установлен, требует VCL50.BPL... Что делать?
Вопрос №2 (+ 4Unix)
Какой командой можно запустить какой-нибудь исполняемый файл, не относящийся к проекту?
Вопрос №3
Как получить HWND окна по его заголовку?
Вопрос №4 (+ 4Unix)
Как получить список расшаренных папок на компе?
Вопрос №5
Как получить имя компа по его IP?
Вопрос №6
Как получить IP компа по его имени?
Вопрос №7
Как залочить CD-drive?
Вопрос №8
Как установить обои на рабочий стол?

0

2

Вопрос №0
Как из 1) double, 2) int перевести данные в обыкновенную строку?
//-------------------------------------------------------------
1)
char buf[10];
double dtmp = 3.1415;
sprintf(buf,"%f",dtmp);
//-------------------------------------------------------------
int decimal,sign;
char *buffer,buf[10];
double dtmp = 3.1415;
int precision = 5;
buffer = _ecvt(dtmp,precision,&decimal,&sign);
strcpy(buf,buffer);
buf[decimal] = '.';
strcpy(buf+decimal+1,buffer+decimal);
//-------------------------------------------------------------
2)
char buf[10];
int itmp = 13;
sprintf(buf,"%d",itmp);
//-------------------------------------------------------------
char buf[10];
int itmp = 13;
_itoa(itmp,buf,10);

0

3

Вопрос №1
Написал я прогу на C++ Builder'е 5.0, а она при запуске на любой машине, где этот Билдер не установлен, требует VCL50.BPL... Что делать?
//-------------------------------------------------------------
Для успешного создания рабочего exe-шника надо:
1. снять галочку в Project->Options->Linker->Use Dynamic RTL.
2. снять галочку в Project->Options->Packages->Build with Runtime Packages.

0

4

Вопрос №2
Какой командой можно запустить какой-нибудь исполняемый файл, не относящийся к проекту?
//-------------------------------------------------------------
1)
system("dir >> c:\\dir.txt");
//-------------------------------------------------------------
2)
WinExec("calc",SW_SHOW);
//-------------------------------------------------------------
3)
ShellExecute(NULL,"open","notepad",NULL,NULL,SW_SHOW);
//-------------------------------------------------------------
4)
_spawnl(_P_WAIT,"c:\\winnt\\notepad.exe","notepad.exe",NULL);
//-------------------------------------------------------------
5)
CreateProcess(...)

(Unix) - from Teknik
//-------------------------------------------------------------
#include <unistd.h>
unsigned short status;
if( fork()==0 ) //порождаем клон процесса
{
/* заменяем программу на нужную нам */
execl("/path/to/executable","arg1","arg2",...,"argN", NULL);
}
/* дожидаемся завершения порожденного процесса */
while(wait(&status)>0);
//-------------------------------------------------------------
Дополнительно man fork, man exec, man wait

0

5

Вопрос №3
Как получить HWND окна по его заголовку?
//-------------------------------------------------------------
1)
char Buf[256];
char *wndname = "Калькулятор";
HWND hWnd = GetTopWindow(NULL);
do
{
hWnd = GetNextWindow(hWnd,GW_HWNDNEXT);
GetWindowText(hWnd,Buf,256);
if (strstr(Buf,wndname) != 0)
break;
} while(hWnd != NULL);
if (hWnd != NULL)
// do something...
//-------------------------------------------------------------
2)
HWND hWnd = FindWindow("SciCalc","Калькулятор");
if (hWnd != NULL)
// do something...

Первым параметром надо передать имя класса приложения. Его можно узнать с помощью программки Spy++ или WinSight32, поставляемой с C++Builder. Кстати,

HWND hWnd = FindWindow(NULL,"Калькулятор");
if (hWnd != NULL)
// do something...

тож работает :)

0

6

Вопрос №4
Как получить список расшаренных папок на компе?
//-------------------------------------------------------------
void GetSharedDirs(char* ip)
{
fstream myFile;
HANDLE hEnum;
NETRESOURCE NetContainer;
NETRESOURCE ResArr[100];
DWORD ResBuf,ToGet,OpenResult;
unsigned k;

NetContainer.dwScope = RESOURCE_GLOBALNET;
NetContainer.dwType = RESOURCETYPE_ANY;
NetContainer.lpLocalName = NULL;
NetContainer.lpRemoteName = ip;
NetContainer.dwUsage = RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_CONNECTABLE;
NetContainer.lpProvider = NULL;

OpenResult = WNetOpenEnum(RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_CONNECTABLE,
&NetContainer,
&hEnum);

if (OpenResult == NO_ERROR)
{
ResBuf = sizeof(ResArr);
ToGet = 100;
if (WNetEnumResource(hEnum, &ToGet, ResArr, &ResBuf) == NO_ERROR)
{
myFile.open("c:\\comp.txt",ios::out);
for (k = 0;k < ToGet;k++)
myFile << ResArr[k].lpRemoteName << endl;
myFile.close();
}
}
else
{
myFile.open("c:\\comp.txt",ios::out);
myFile << "hm...";
myFile.close();
}
WNetCloseEnum(hEnum);
}

вызываем GetSharedDirs("\\\\172.16.0.4") из своей программы  и
получаем в c:\comp.txt список пошареных папок на Wasp'е:
\\172.16.0.4\Music
\\172.16.0.4\Clips
\\172.16.0.4\Drivers
\\172.16.0.4\Distrib

(Unix) - from Teknik
//-------------------------------------------------------------
#include <stdio.h>
#include <errno.h>
#include <sys/time.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <libsmbclient.h>
/* функция авторизации, всегда возвращает пустые имя пользователя и
пароль для анонимной авторизации, можно переопределить */
void auth_fn(const char *server, const char *share,
   char *workgroup, int wglen,
   char *username, int unlen,
   char *password, int pwlen)
{
   strncpy(username,"",unlen);
   strncpy(password,"",pwlen);
}
int main(int argc, char *argv[])
{
/* инициализация клиента, передаются функция авторизации и debug
level, возвращается 0 - успех, -1 - что-то сломалось*/
   int err = smbc_init(auth_fn, 0);
   if (err < 0)
   {
       fprintf(stderr, "Initializing the smbclient library ...:
%s\n", strerror(err));
       return 0;
   }
/* открываем интересующую директорию:
*  smb:// - список доступных групп
*  smb://powergroup! - список компов в powergroup!
*  smb://neotek-pc - список ресурсов на компе
*  smb://neotek-pc/pub/... - листинг директории
*/             
   int dh = smbc_opendir("smb://neotek-pc");
   if(dh<0)
   {
       fprintf(stderr, "Could not open smb dir.\n");
       return 0;
   }
   struct smbc_dirent* dirent;
   /* читаем и парсим очередной элемент */
   while(dirent = smbc_readdir(dh))
   {
       char *type;
       switch(dirent->smbc_type)
       {
           case SMBC_WORKGROUP:
               type = "Workgroup";
               break;             
           case SMBC_SERVER:
               type = "Server";
               break;             
           case SMBC_FILE_SHARE:
               type = "File Share";
               break;             
           case SMBC_PRINTER_SHARE:
               type = "Printer";
               break;             
           case SMBC_COMMS_SHARE:
               type = "";
               break;             
           case SMBC_IPC_SHARE:
               type = "IPC";
               break;             
           case SMBC_DIR:
               type = "Directory";
               break;             
           case SMBC_FILE:
               type = "File";
               break;             
           case SMBC_LINK:
               type = "Link";
               break;
       }
       printf("%s\t%s\n", dirent->name, type);
   }
   smbc_closedir(dh);
}
Компилится с ключиком -lsmbclient:
gcc $CFLAGS -o sharelist sahrelist.c -lsmbclient
Для получения libsmbclient надо сконфигурировать и собрать самбу с
параметром --with-libsmbclient.

0

7

Вопрос №5
Как получить имя компа по его IP?
//-------------------------------------------------------------
char* GetCompnameByIp(char* ip)
{
struct hostent* myH;
unsigned int ip_address = inet_addr(ip);

myH = gethostbyaddr((char *)&ip_address,4,AF_INET);
if (myH == NULL)
return NULL;

return myH->h_name;
}

из своей программы вызываем эту ф-цию:
WSADATA myW;
WSAStartup(MAKEWORD(2,1),&myW);
GetCompnameByIp("172.16.127.230");
WSACleanup();

0

8

Вопрос №6
Как получить IP компа по его имени?
//-------------------------------------------------------------
char* GetIPByName(char* compname)
{
struct hostent* myH;
struct in_addr myAddr;

myH = gethostbyname(compname);
memcpy(&myAddr, myH->h_addr_list[0], sizeof(in_addr));

return inet_ntoa(myAddr);
}

и тогда GetIPByName("core-pc") возвратит "172.16.127.230"

0

9

Вопрос №7
Как залочить CD-drive?
//-------------------------------------------------------------
BOOL LockCD(char cd_letter,BOOL action)
{
HANDLE hCD;
BOOL bResult;
DWORD dwBytes;
char msg[20] = "\\\\.\\X:";
PREVENT_MEDIA_REMOVAL myStruct;

msg[4] = cd_letter;
hCD = CreateFile(msg,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
if (hCD == INVALID_HANDLE_VALUE)
{
sprintf(msg,"%s: %d","no cd-rom handle. error",GetLastError());
MessageBox(NULL,msg,"goddamn!",MB_OK | MB_ICONERROR);
return FALSE;
}

myStruct.PreventMediaRemoval = action;
bResult = DeviceIoControl(hCD,IOCTL_STORAGE_MEDIA_REMOVAL,&myStruct,sizeof(myStruct),NULL,0,&dwBytes,(LPOVERLAPPED)NULL);
if (!bResult)
{
sprintf(msg,"%s: %d","can't lock/unlock. error",GetLastError());
MessageBox(NULL,msg,"goddamn!",MB_OK | MB_ICONERROR);
return FALSE;
}

CloseHandle(hCD);

return TRUE;
}

и тогда
LockCD('H',1);
блокирует выезд лотка для cd-rom'а с буквой H, а
LockCD('H',0);
разблокирует

0

10

Вопрос №8
Как установить обои на рабочий стол?
//-------------------------------------------------------------
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,"c:\\kaif.bmp",SPIF_UPDATEINIFILE);

установит в качестве обоев картинку C:\Kaif.bmp

0


Вы здесь » образовательный форум » C++ » F A Q