Я начинающий, подскажите как...(Все вопросы начинающих - постить только здесь!!!)
Допустима ли ситуация запуска двух копий program_1 или program_2? Если да - тогда необходимо искать процесс по имени и если запускается например program_2 - искать в процессах с именем program_1 и если он есть - завершать программу. Если по логике может быть запущена только одна копия программы - тогда используй мьютексы. Алгоритм такой если запускается program_1 - пытаешься создать мьютекс - если ошибка - мьютекс уже создан - ищешь в памяти и завершаешь процесс с именем program_2. Если запускается program_2 и таже ошибка - просто завершаешь процесс. Наличие третьей программы тут абсолютно ненужно.
Я так понимаю, что это для присутствующих исходников program_1 и program_2. Вот только проблема в том, что это 2 абсолютно сторонних приложения и их исходников у меня нет. Поэтому, видимо, нужна программа-перехватчик запуска, которая при запуске определенного процесса убивала бы нужный при необходимости. Тут-то и проблема. Также, как можно найти хэндл процесса для убивания через TerminateProcess() по имени его исполняемого файла?
Я так понимаю, что это для присутствующих исходников program_1 и program_2. Вот только проблема в том, что это 2 абсолютно сторонних приложения и их исходников у меня нет. Поэтому, видимо, нужна программа-перехватчик запуска, которая при запуске определенного процесса убивала бы нужный при необходимости. Тут-то и проблема. Также, как можно найти хэндл процесса для убивания через TerminateProcess() по имени его исполняемого файла?
Это пример, не тестировался и не проверялся, писался с головы, но скорей всего должен быть рабочим. Не забывай делать проверку на успешность выполнения функций.
...
void *hg;
unsigned long* pPid;
unsigned long result;
Handle hWnd = FindWindow(NULL,"program_2");//Ищем процесс
hg = GlobalAlloc(GMEM_SHARE,sizeof(unsigned long));
pPid = (unsigned long *)GlobalLock(hg);//Прежде чем чтолибо делать - блокируем обязательно
result = GetWindowThreadProcessId(hWnd,pPid);//Получаем ид процесса
HANDLE ps = OpenProcess(1,false,*pPid);//открываеем(получаем хендл)
TerminateProcess(ps,-9);//прибиваем
GlobalUnlock(hg);//Не забываем снять блокировку
GlobalFree(hg);
}
Ну то бишь, мне нужно знать сколько секунд пройдет с "00:00:00 January 1, 1970" (UTC) до, например, 15 января 2018 года? Перерыл MSDN ничего толкового не нашел, кроме получения текущей метки ... :(
Хм.. Вот мой код:
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
void *hg;
unsigned long* pPid;
unsigned long result;
HANDLE hWnd = FindWindow(NULL,"program_2");//Ищем процесс
hg = GlobalAlloc(GMEM_SHARE,sizeof(unsigned long));
pPid = (unsigned long *)GlobalLock(hg);//Прежде чем чтолибо делать - блокируем обязательно
result = GetWindowThreadProcessId(hWnd,pPid);//Получаем ид процесса
HANDLE ps = OpenProcess(1,false,*pPid);//открываеем(получаем хендл)
TerminateProcess(ps,-9);//прибиваем
GlobalUnlock(hg);//Не забываем снять блокировку
GlobalFree(hg);
return 0;
}
При компиляции выдает:
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
#include <stdio.h>
int main()
{
time_t ltime, newtime;
struct tm mytime;
mytime.tm_sec=0;
mytime.tm_min=0;
mytime.tm_hour=0;
mytime.tm_mday=22;
mytime.tm_mon=10;
mytime.tm_year=2007-1900;
newtime=mktime(&mytime);
time( <ime );
printf( "Days:\t%ld\n\n", (ltime-newtime)/(60*60*24) );
}
FindWindow() ищет процесс по заголовку окна. Но в program_2 (которую надо убивать) заголовок постоянно динамический, предугадать его возможности нет, он меняется во время работы в зависимоти от действий юзера, однако само имя процесса всегда одно и то же (program_2.exe). Как можно искать не по заголовку окна, а по названию процесса?
PS: за ссылку спасибо, поизучаю..
#include <tlhelp32.h>
#include <tchar.h>
#include <stdio.h>
// Forward declarations:
BOOL GetProcessList( );
void main( )
{
GetProcessList( );
}
BOOL GetProcessList( )
{
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;
// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
// Set the size of the structure before using it.
pe32.dwSize = sizeof( PROCESSENTRY32 );
// Retrieve information about the first process,
// and exit if unsuccessful
if( !Process32First( hProcessSnap, &pe32 ) )
{
CloseHandle( hProcessSnap ); // clean the snapshot object
return( FALSE );
}
// Now walk the snapshot of processes, and
// display information about each process in turn
do
{
printf( pe32.szExeFile );
printf( "\n");
if (pe32.szExeFile == "program_2.exe")
{
printf("Вхожу в условие");
hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
if (hProcess)
{
TerminateProcess(hProcess, -9);
CloseHandle(hProcess);
}
}
} while( Process32Next( hProcessSnap, &pe32 ) );
CloseHandle( hProcessSnap );
return( TRUE );
}
Список процессов выводит, но вот в условие pe32.szExeFile == "program_2.exe" почему-то не входит, хотя program_2.exe точно есть в памяти и в списке процессов выводится:confused:
UPD: Разобрался, strstr() помог..
зы
заранее спасибо.
Сообщения читаем внимательно, а не только для того что бы запостить. Человек написал - что он сам разобрался.
#include "IP.h"
int main()
{
Soket a;
a.ConstructIPHeader(IpProtocol_UDP,
IpFragFlag_DONT_FRAG,IP_DEF_TTL,GetCurrentProcessId());
a.SetIPHeaderAddress( "127.0.0.1", "127.0.0.1" );
a.SendBuf( "123", 3 );
return 0;
}
//=====================IP.H==============================
#include <ws2tcpip.h>
#pragma comment (lib, "C:\\Program Files\\Microsoft Visual Studio\\VC98\\Lib\\WSOCK32.LIB")
//////////////////////////////////////////////////////////////////
// //
// IP Header //
// Implementation of RFC791 IP Header //
// //
//////////////////////////////////////////////////////////////////
#define PseudoHeaderLength sizeof(PseudoHeader)
#define IpHeaderLength sizeof(IpHeader)
#define IpVersion 4
//Service types
#define IpService_NETWORK_CONTROL 111
#define IpService_INTERNETWORK_CONTROL 110
#define IpService_CRITIC_ECP 101
#define IpService_FLASH_OVERIDE 100
#define IpService_FLASH 011
#define IpService_IMMEDIATE 010
#define IpService_PRIORITY 001
#define IpService_ROUTINE 0
//Internet protocols
#define IpProtocol_ICMP 1
#define IpProtocol_TCP 6
#define IpProtocol_UDP 17
//Fragmetation flag
#define IpFragFlag_MAY_FRAG 0x0000
#define IpFragFlag_MORE_FRAG 0x2000
#define IpFragFlag_LAST_FRAG 0x5000
#define IpFragFlag_DONT_FRAG 0x4000
#define IP_DEF_TTL 128
struct PseudoHeader //Ñòðóêòóðà ïñåâäî çàãîëîâêà
{
unsigned int SourceAddress;
unsigned int DestinationAddress;
unsigned char Zeros;
unsigned char PTCL;
unsigned short Length;
};
struct IpHeader //Ñòðóêòóðà IP çàãîëîâêà
{
unsigned char HeaderLength_Version;
unsigned char TypeOfService; // Type of service
unsigned short TotalLength; // total length of the packet
unsigned short Identification; // unique identifier
unsigned short FragmentationFlags; // flags
unsigned char TTL; // Time To Live
unsigned char Protocol; // protocol (TCP, UDP etc)
unsigned short CheckSum; // IP Header checksum
unsigned int sourceIPAddress; // Source address
unsigned int destIPAddress; // Destination Address
};
class Soket
{
sockaddr_in m_TargetAddress;
int m_SpoofSocket;
IpHeader FAR * IpH;
PseudoHeader FAR * PsH;
unsigned short CalculateChecksum( unsigned short * usBuf, int iSize );
public:
~Soket();
Soket();
void ConstructIPHeader( unsigned char ucProtocol, unsigned short usFragmentationFlags, unsigned short usTTL,
unsigned short usIdentification );
void SetIPHeaderAddress( LPCSTR lpSourceAddress, LPCSTR lpDestinationAddress );
unsigned short PseudoChecksum();
void SendBuf( char * buf, int len );
};
Soket::~Soket()
{
closesocket(m_SpoofSocket);
WSACleanup();
}
Soket::Soket()
{
WSAData WSADat;
WSAStartup( 0x0202, & WSADat );
m_TargetAddress.sin_family = AF_INET;
m_TargetAddress.sin_port = 0;
PsH->Zeros = 0;
}
void Soket::ConstructIPHeader( unsigned char ucProtocol, unsigned short usFragmentationFlags, unsigned short usTTL,
unsigned short usIdentification )
{
m_SpoofSocket = socket( AF_INET, SOCK_RAW, ucProtocol );
unsigned int iTrue = 1;
setsockopt( m_SpoofSocket, IPPROTO_IP, IP_HDRINCL, ( char * ) & iTrue, sizeof( iTrue ) );
IpH->HeaderLength_Version = IpHeaderLength / 4 + IpVersion * 16;
IpH->Protocol = ucProtocol;
PsH->PTCL = ucProtocol;
IpH->FragmentationFlags = htons( usFragmentationFlags );
//Time to live
IpH->TTL = usTTL;
//Checksum - set to 0
IpH->CheckSum = 0;
//Èäåíòèôèêàöèÿ
IpH->Identification = htons( usIdentification );
//Ïðèîðèòåò
IpH->TypeOfService = IpService_ROUTINE;
}
void Soket::SetIPHeaderAddress( LPCSTR lpSourceAddress, LPCSTR lpDestinationAddress )
{
IpH->sourceIPAddress = inet_addr( lpSourceAddress );
PsH->SourceAddress = inet_addr( lpSourceAddress );
//Àäðåññ íàçíà÷åíèÿ
IpH->destIPAddress =inet_addr( lpDestinationAddress );
m_TargetAddress.sin_addr.s_addr = inet_addr( lpDestinationAddress );
PsH->DestinationAddress = inet_addr( lpDestinationAddress );
}
unsigned short Soket::CalculateChecksum( unsigned short * usBuf, int iSize )
{
unsigned long usChksum = 0;
//Calculate the checksum
while ( iSize > 1 )
{
usChksum += * usBuf++;
iSize -= sizeof( unsigned short );
}
//If we have one char left
if ( iSize )
usChksum += * ( unsigned char * ) usBuf;
//Complete the calculations
usChksum = ( usChksum >> 16 ) + ( usChksum & 0xffff );
usChksum += ( usChksum >> 16 );
//Return the value (inversed)
return ( unsigned short ) ( ~usChksum );
}
void Soket::SendBuf( char * buf, int len )
{
PsH->Length = len;
int iTotalLength = IpHeaderLength + len;
IpH->TotalLength = htons( iTotalLength );
char * newBuf = new char[iTotalLength];
memcpy( newBuf, IpH, IpHeaderLength );
memcpy( newBuf + IpHeaderLength, buf, len );
IpH->CheckSum = CalculateChecksum( ( unsigned short * ) newBuf, iTotalLength );
memcpy( newBuf, IpH, IpHeaderLength );
sendto( m_SpoofSocket, ( const char * ) newBuf, iTotalLength, 0, ( sockaddr * ) & m_TargetAddress,
sizeof( m_TargetAddress ) );
}
unsigned short Soket::PseudoChecksum()
{
unsigned short Checksum = CalculateChecksum( ( unsigned short * ) PsH, PsH->Length );
return Checksum;
}[CODE][CODE]
[/CODE]
Т.е. в конструкторе сокета должно присутствовать чтото типа:
и соответственно необходимо не забыть объявить конструктор для структуры. Примерно так. Пробуйте.
Есть значение summ типа double . Перевожу его в char . Пишу
- не подходит .
Пишу
-та же хрень .
Главное, в обоих случаях программа компилируется, но в нужных полях пишутся непонятные значки .
iter++;
summ=summ+1/iter;
*a=(char)summ;
*b=(char)iter;
Edit1->Text=a;
Edit2->Text=b;
Нихрена .
iter++;
summ=summ+1/iter;
*a=(char)summ;
*b=(char)iter;
Edit1->Text=a;
Edit2->Text=b;
Нихрена .
1. Как получать код вводимого с клавиатуры символа сразу после нажатия на клавишу(ввод из консоли)? Console.Read возвращает введённый символ только после нажатия на Enter. Ввод пароляя целиком (одной строкой) не подойдёт, т.к. нужно запоминать время ввода каждого символа.
2. Как подавлять вывод вводимых символов на экран или заменять их на звёздочки?
3. Следующий фргамент кода, написанный в тяжких мучениях :), должен хэшировать вводимую с клавиатуры строку. Однако cryptoStream.Read возвращает 0. Не понимаю решительно, в чём проблема.
string input = Console.ReadLine();
MemoryStream stringInMemory = new MemoryStream();
stringInMemory.Capacity = 10000;
StreamWriter writer = new StreamWriter( stringInMemory );
writer.AutoFlush = true;
writer.WriteLine( input );
HashAlgorithm hashAlgorithm = new SHA1CryptoServiceProvider();
ICryptoTransform cryptoTransform = (hashAlgorithm as ICryptoTransform);
CryptoStream cryptoStream = new CryptoStream( stringInMemory , cryptoTransform , CryptoStreamMode.Read );
int result;
byte[] hash = new byte[ 20 ];
result = cryptoStream.Read( hash , 0 , 20 );
Где косяк?
Если кто-нибудь подскажет способ для преобразования типа string в тип byte[] буду крайне признателен.
Господа,подскажите пожалуйста алгоритм нахождения пифагоровых
троек чисел,вроде бы тривиальная задача,а бьюсь с нею уже вторые
сутки не могу решить,прошу о помощи!
У меня такой вопрос , вот в некоторых исходниках бывает (int*)peremennaya или (SOCKEADDR*)&adr ну так вопрос что это означает ??
Это преобразование типов
(int*) - к указателю на int
(SOCKEADDR*) - к указателю на SOCKEADDR
У меня такой вопрос , вот в некоторых исходниках бывает (int*)peremennaya или (SOCKEADDR*)&adr ну так вопрос что это означает ??
Я так понял это ты про С/С++. Так вот * означает указатель на тип, а & это унарный оператор возвращающий адресс. А лучше возми учебное руководство по С или С++ и внимательно изучи, потому-что это основы синтаксиса языка.
А то исходник в принципе я нашел, да разобраться очень хочется)))
Пишу с использованием Qt.
А то исходник в принципе я нашел, да разобраться очень хочется)))
Пишу с использованием Qt.
С помощью Qt?
text.toBase64(); // returns "UXQgaXMgZ3JlYXQh"
text.toBase64(); // returns "UXQgaXMgZ3JlYXQh"
Большое спасибо!
По запросу base64 Assistant что-то нашел только fromBase64 (((
...
MemoryStream msEncrypt = new MemoryStream(bin);
SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
rijn.Key = new byte[32] { ... };
rijn.IV = new byte[16] { ... };
CryptoStream encStream = new CryptoStream(msEncrypt, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write);
encStream.Write(bin, 0, len);
//encStream.FlushFinalBlock();
encrypted = new byte[len];
msEncrypt.Position = 0;
msEncrypt.Read(encrypted, 0, len);
//encStream.Close();
msEncrypt.Close();
во-первых, на выходе получаем, что массив encrypted совпадает с исходным bin
а во-вторых, при попытке закрыть поток encStream (или сделать FlushFinalBlock) ругается на размер потока ("Memory stream is not expandable." либо "Length of the data to decrypt is invalid." - через раз) :confused:
1. Ищем нужный символ в строке (пробел)
2. От этого символа начинаем проверять все последущие символы, записывая их в отдельную переменную. Копируем, пока не встретим другой, нужный символ.
Какие ф-ии надо использовать для решения такой задачи? Если можно, то дайте, пожалуйста, ссылку на пример.
заранее спасибо
например, так:
// ...
// создаем массив индексов
// 0 - такого элемента не было, 1 - повтор
byte[] inx = byte[n];
foreach (byte a in inx) a = 0;
// счетчик количества неповторов (сразу посчитали первый элемент)
int s = 1;
for (int i = 0; i < n; i++)
if (inx != 1)
for (int j = i+1; j < n; j++)
if (data == data[j]) inx[j] = 1;
else s++;
// создаем "чистый" массив
int[] dataClr = new int;
int j = 0;
for (int i = 0; i < n; i++)
if (inx = 0) {
dataClr[j] = data;
j++;
}
1. Ищем нужный символ в строке (пробел)
2. От этого символа начинаем проверять все последущие символы, записывая их в отдельную переменную. Копируем, пока не встретим другой, нужный символ.
Какие ф-ии надо использовать для решения такой задачи? Если можно, то дайте, пожалуйста, ссылку на пример.
класс string
методы IndexOf() и обращение по индексу - больше ничго для локального счастья не нужно будет))
1. Ищем нужный символ в строке (пробел)
2. От этого символа начинаем проверять все последущие символы, записывая их в отдельную переменную. Копируем, пока не встретим другой, нужный символ.
Какие ф-ии надо использовать для решения такой задачи? Если можно, то дайте, пожалуйста, ссылку на пример.
методы IndexOf() и обращение по индексу - больше ничго для локального счастья не нужно будет))
зачем string? несложно и родным char-овским массивом обойтись.
пример
char* str="itemgassing 120";//что то мне кажется что задача сводится именно е етому - чтение значение перменной из файла
char* nstr; //тут будем хранить значение новой строки (то что после побела)
int i;
for(i=0;i<=strlen(str);i++)
{
if(str=' ')//коли уж у нас пробел
strcpy(nstr,str+(i+1)*sizeof(char),(strlen(str)-i-1)*sizeof(char))//копируем в nstr из str+i - i - ето смещение на i размеров char. + 1- чтобы не считать пробел.
//strlen(str) - скока всего символов в строке
}
собственно ето все писалось в браузере, такчто заранее приношу извинения за очепятки (сама идея вроде верна)
пример
char* str="itemgassing 120";//что то мне кажется что задача сводится именно е етому - чтение значение перменной из файла
char* nstr; //тут будем хранить значение новой строки (то что после побела)
int i;
for(i=0;i<=strlen(str);i++)
{
if(str=' ')//коли уж у нас пробел
strcpy(nstr,str+(i+1)*sizeof(char),(strlen(str)-i-1)*sizeof(char))//копируем в nstr из str+i - i - ето смещение на i размеров char. + 1- чтобы не считать пробел.
//strlen(str) - скока всего символов в строке
}
собственно ето все писалось в браузере, такчто заранее приношу извинения за очепятки (сама идея вроде верна)
а если не один пробел будет, а 2 или 3 ?
собственно выйти из цикла обычным способом - break при первом попавшемся пробеле, елси нужен отсчет от последнего - то for(i=strlen(str);i>=0;i--).
а вот еще интересный способ:
for(int i=0,bool is_exit=false;(i<=strlen(str))&&(!is_exit);i++)
{
...
}
тока я еще его не проверял на работоспособность.
про один пробел не говорилось... а он может быть 10-й по счету
ЗЫ: алгоритм надо рассчитывать "на дурака" либо запрещать вводить более одного пробела
про один пробел не говорилось...
совершенно верно, поетому я и сказал, что мне показалось :)
String* str = S"Now is the time for all good men to come to the aid of their party.";
// начальный и конечный разделители
char startSimb = ' ';
char endSimb = ' ';
// начало конец куска нужного строки
int start, end;
start = str->IndexOf(startSimb, 0);
end = str->IndexOf(endSimb, start);
// формируем подстроку
String* substr = str->Substring(start,end);
// получим слово is