• XSS.stack #1 – первый литературный журнал от юзеров форума

Вопросы по С/С++

Quake3

TPU unit
Забанен
Регистрация
03.11.2010
Сообщения
4 529
Решения
4
Реакции
5 305
Депозит
0.046
Пожалуйста, обратите внимание, что пользователь заблокирован
Вроде такой темы нет на форуме, начну.
Пробую переходить на Си, и постоянно случается какой-то фейл. Вроде бы должно быть проще, а на деле - все сложнее. Например, в каком файле объявлен прототип функции GetFileSizeEx ? Пробовал
Код:
#include <windows.h>
#include <Winbase.h>
#include <FileAPI.h>
Толку 0, пишет на все

undefined reference to `GetFileSizeEx'

Я знаю, что можно вызвать через loadlibrary/getprocaddres, но это костыль, как сделать напрямую? Или в С это не объявлено, или у меня просто старый компилятор? Пробовал codeblocks(mingw) и visual studio 6.

p.s. в Масм, как не странно, все нормально.
 
Все объявленно. Просто у тебя старый фарш и в Path наверное месиво.

>> visual studio 6
жеесть, выкинуть

>> codeblocks(mingw)
выкинуть

1) Поставить нормальную студию (если олдфаг - 2k8 многие пользуют до сих пор, если нет, ставь 2k12, или 2k10 если тошнит от нового интерфейса)
2) Поставить Platform SDK последний
3) Profit

Если не пошло после этого, значит msvc6 или mingw поднасрало и не убрало за собой, нужно искать и вычищать.
 
На PHP, к примеру, мы можем сделать так:
Код:
$test = 'test ';
echo $test . 'test2';
т.е. вывести на экран переменную вместе с еще одним текстом через точку.

На C же, лишь через спецификатор %s в printf библиотеки stdio.h:
Код:
char test[] = "test";
printf("%s test2", test);

Для примера возьмём элементарный дроп файла: получили мы значение где находится temp (пусть это будет C:\users\pupkin\appdata\local\temp). Теперь нам нужно "соединить" путь к темп, и название файла, т.е. должно выйти следующее => C:\users\pupkin\appdata\local\temp + \file.exe = C:\users\pupkin\appdata\local\temp\file.exe. Ну а дальше уже CopyFile бла бла бла...
Так-то понятно, что можно сделать следующим образом:
Код:
sprintf(new,"%s\\file.exe", temp);
CopyFile(argv[0], new, 0);
..но это как-бы консольный вариант, и в win32-приложение stdio не место. Какой выход? Писать свою функцию, или существует "альтернатива" sprintf о которой мне неизвестно (типа: new = temp+"\\file.exe"))? Как быть?(

п.с. как я понял, то этому виной строгая типизация.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
neko
Спасибо, попробую новую студию. Я думал, что новые версии больше для сишарп и т.п., а для Си хватит и старой.

Wolfomeo
wsprintf ?
 
Wolfomeo
т.е. вывести на экран переменную вместе с еще одним текстом через точку.

На C же, лишь через спецификатор %s в printf библиотеки stdio.h:
Код|Code
char test[] = "test";
printf("%s test2", test);


Для примера возьмём элементарный дроп файла: получили мы значение где находится temp (пусть это будет C:\users\pupkin\appdata\local\temp). Теперь нам нужно "соединить" путь к темп, и название файла, т.е. должно выйти следующее => C:\users\pupkin\appdata\local\temp + \file.exe = C:\users\pupkin\appdata\local\temp\file.exe. Ну а дальше уже CopyFile бла бла бла...
Так-то понятно, что можно сделать следующим образом:
Код|Code
sprintf(new,"%s\\file.exe", temp);
CopyFile(argv[0], new, 0);

..но это как-бы консольный вариант, и в win32-приложение stdio не место. Какой выход? Писать свою функцию, или существует "альтернатива" sprintf о которой мне неизвестно (типа: new = temp+"\\file.exe"))? Как быть?(
зачем использовать принт\спринт не проще выделить память потом заюзать конечно если не надо выводить на экран (WriteConsoleW\WriteConsoleA\ReadConsoleA\ReadConsoleW)
Код:
lstrcpynA\lstrcpynW
lstrcpyA\lstrcpyW
или     
lstrcatA\lstrcatW

#include <windows.h>
 
и еще чуток WinApi
Код:
ExpandEnvironmentStrings("%tmp%\\123.exe",pBuf,cbBuf);
UPD по теме: GetFileSizeEx у меня нашелся в WinBase.h, а это значит должно быть достаточно #include <windows.h>
 
Пожалуйста, обратите внимание, что пользователь заблокирован
accwranadm
А какая у тебя версия студии?
У меня его нигде нет, мб в шестой студии (она вроде 2000 года) не было еще такой апи? Многие апи с *Ex вроде появились в виндовс 2к и позже. Хотя могу ошибаться.
 
Wolfomeo
почти весь нужный CRT рантайм есть в ntdll, в том числе и ntdll.sprintf/ntdll.sprintf_s

Quake3
если не уверены, всегда есть msdn:

http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx

Minimum supported client Windows XP [desktop apps only]
там же смотреть и необходимые инклуды

msvs 6 вышла в 98 году, так что изначально не поддерживала XP в качестве таргета, в принципе PSDK могло бы решить проблемы теоритически, но я сомневаюсь, что последнии совместимы с шестеркой + в ней присутствуют известные баги в компиле на сколько помню, поэтому не стоит пользоваться.

accwranadm
в 2k10/2k12 IntelliSense умнее (лечится на 2k8 ассистом), более логичная организация пропертей, кое-что ещё по мелочи. + 2k12 нужна для WDK 8. Ну и на мой вкус интерфейс получше, но я извращенец в этом плане да и 2k8 мало пользовался в виде IDE.
 
accwranadm,уже 12-ю юзают... 10-я еще пока в ходу.
neko,а что за баги в компиле? можете осветить?
 
Для мелкого злокодинга, MVS 2010 Pro сгодится же?) Как-то качал эту редакцию без особых раздумий в их различии.. на C/C++ компиляторах, от версии к версии, ничего ведь не сказывается?

п.с. слышал бытует мнение, что 2008 - самая "удачная" версия MVS, так ли это?
 
Dark Koder
я уже не помню, дело было очень давно


Wolfomeo
Вам не нужно то, что в более полных редакциях есть, pro вполне хватает. 2k12 мне нравится несравненно больше 2k8 (как и до этого 2k10), но это все дело вкуса и холиварить на эту тему не стоит, единственно что компилятор конечно обновляется, подкручивается оптимизация и устраняются баги, так что имеет смысл пользоваться более новым комппилятором, тем более слышал, что можно прикрутить более новый компилятор к 2k8 из PSDK вроде.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
neko
Но вроде как 2k12 не поддерживает ХР? Или если отключить crt, то все нормально?

Вообще, реально ли в Си использовать динамический crt? Как в Масм, есть инклуд и либа msvcrt, и с нее можно вызывать функции. В Си я встречал варианты либо использование статического crt (но тогда бинарник под 100кб), либо вообще отказ от crt (тогда нафиг он нужен вообще этот Си, если такие неудобства).
В общем, можно ли как-то использовать системный msvcrt без loadlibrary и т.п.?
 
Quake3
Что на C, что на ASM одинаково получалось схожие задачи решать (по размеру и пр. параметрам, бинарь на C ничем не отставал от ASM'овского): _http://forum.antichat.ru/thread270667.html

Немного муторно правда, через что асм (из-за своей простоты в подобных делах) и приглянулся был :D
 
Quake3
Поддерживает, в свойствах проекта нужно выбрать совместимый с XP тулчейн. Только RC не поддерживала, потом вернули.

я уже писал, что часть функций сишной библиотеке есть в ntdll. Но в основном это работа со строками, а больше впрочем и не нужно. CRT этим неограничивается + там свой стартап код (что вместе и составляют среду выполнения с). Кроме того crt также можно линковать динамически, указав это в свойствах проекта (либо опцией компилятора /MTxx), + еще можно отказаться от стартап кода, указав свою точку входа. Сам crt нужно для партабельных программ, ктр можно компилировать не только на винде и не только студией, без использования системно-специфичного кода, понятное дело для малвари в этом нет необходимости.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
neko
Я не так выразился, мне нужен не сам CRT, а именно функции. Чтобы можно было, скажем, вызвать какой-нибудь strtok без увеличения веса проги.

Подскажите еще по такому вопросу. Есть строка, в которой мне надо найти последний слеш и записать нуллбайт по этому адресу (обрезать строку таким образом). Как это сделать в Си? Делаю так:

Код:
char *pos;
pos = strrchr(curPath,'\\');
и что дальше? Как записать 0 по адресу, на который указывает pos ?
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх