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

» Вопросы по программированию на C/С++

Автор: bomzzz
Дата сообщения: 11.02.2013 15:22
типа статическая библиотека? но все равно приложение тяжелое получится

Добавлено:
помогите пожалуйста. с 13 компилятором cl и link от 10 студии все работает. не получается приручить cl от 10 студии, все файлы в папке bin= лежат. пишет не могу c1.dll запустить
http://rghost.ru/43721046
хочется выкинуть из студии все лишнее. она на диске гига 4 занимает и еще фреймворки гиг не меньше
Автор: ne_viens
Дата сообщения: 11.02.2013 16:33
Инлаин- просто вставляется инструкции wcscpy() посреди find_files()
Без call'ов и jmp'ов код быстрее выполняется.
С длинными функциями как sprintf() конечно так не надо делать, а то код действительно разрастётся.


Студия при помощи Environment Variables настраивается.
Например, чтобы запустить ту, которая в твоём архиве, в бат пишем:

set path=%path%;C:\todel\C\bin
set INCLUDE=C:\todel\C\inc\crt
set LIB=C:\todel\C\lib
cl.exe /Ox %~nx1 /link /MERGE:.rdata=.text
pause

Кстати, нет необходимости вызывать компилер и линкер отдельно, cl сам вызывает link при необходимости.

Из hello.c убираем полные пути:

#include <stdio.h>
#include <conio.h>
#include <string.h>

, так как всё что в <> компилер будет искать в %INCLUDE%

Автор: dimon0476
Дата сообщения: 11.02.2013 17:17
Можно подсказать: можно ли найти Microsoft Visual Studio С++ 2008 Standart Edition оригинальный образ? Можно ли сравнить контрольные суммы с сайтом МС? Какие дополнительные возможности дает Стандарт перед Експресс? Спасибо за ответ.
Автор: bomzzz
Дата сообщения: 11.02.2013 17:31

Цитата:
Кстати, нет необходимости вызывать компилер и линкер отдельно, cl сам вызывает link при необходимости.

сам не знаю почему, у масма все примеры вот так. ну я и сюда притащил.

Добавлено:
25 кбайт консолька - я в шоке

http://rghost.ru/43723090
единственное консольное приложение делал - 2.5 кбайта, поджулил немного с MERGE и вообще дату в код засунул. старый компилятор наверно бы в 2.0 зажал, можно еще Align попробовать. месяц писал программку из несколько тысяч строк - 29.5 кбайт получилось. а тут одна строка 25 кб
Автор: ne_viens
Дата сообщения: 11.02.2013 17:50
Никто не мешает писать так:

#include <windows.h>
#pragma comment(linker, "/NODEFAULTLIB /ENTRY:main /MERGE:.rdata=.text")

main()
{
    int tmp;
    
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    WriteFile(h, "Hello world!\n", 13, &tmp, 0);
    h = GetStdHandle(STD_INPUT_HANDLE);
    ReadFile(h, (char*)&tmp, 1, &tmp, 0);
    ExitProcess(0);
}

, будет 1KB.
Автор: bomzzz
Дата сообщения: 11.02.2013 17:55
ага. вот так лучше - знакомо и понятно
Автор: AZJIO
Дата сообщения: 11.02.2013 19:11
ne_viens
Прокомментировал код, посмотри, верно:

Код: #ifndef UNICODE
#define UNICODE
#endif
#ifndef _UNICODE
#define _UNICODE
#endif
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

#pragma optimize("s", on)


void find_files(wchar_t* wrkdir)
{

HANDLE hFile; // объявляем дескриптор файла
WIN32_FIND_DATA file_data; // объявляем ??? видимо объект
wchar_t wrkdirtemp[MAX_PATH], buf[MAX_PATH]; // объявляем тип wchar_t два массива разамеров в длинну пути

if(!wrkdir || !wrkdir[0]) // если не wrkdir или не wrkdir[0]
return; // тогда вылет

wcscpy(wrkdirtemp, wrkdir); // копируем wrkdirtemp в строку wrkdir

if(wrkdirtemp[wcslen(wrkdirtemp)-1] != L'\\') // если последний символ не является "\"
wcscat(wrkdirtemp, L"\\"); // то присоединяем символ "\"

wsprintf(buf, L"%s*", wrkdirtemp); // отправляем строку в buf
hFile = FindFirstFile(buf, &file_data); // запрос поиска
if(hFile == INVALID_HANDLE_VALUE) // если не дескриптор
return; // то вылет

do
{
if(file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // поразрядная операция "И" с объектом? Видимо случай для каталога
{
// if(wcscmp(file_data.cFileName, L".") && wcscmp(file_data.cFileName, L".."))
if('.' == *(int*)&file_data.cFileName || (0x002e002e == *(int*)&file_data.cFileName && 0 == *(short*)((char*)file_data.cFileName + 4))) // непонятки
continue;

wsprintf(buf, L"%s%s", wrkdirtemp, file_data.cFileName); // записываем в buf путь и имя
find_files(buf); // рекурсивный вызов для исследовнаия вложенной папки
}
else
{
// if(!(file_data.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)))
wprintf(L"%s%s\n", wrkdirtemp, file_data.cFileName); // записываем путь и имя на вывод
}
}
while(FindNextFile(hFile, &file_data)); // получение следующего файла объекта file_data

FindClose(hFile);
}


main()
{

find_files(L"C:\\WINDOWS\\");
getchar();
}

Автор: ne_viens
Дата сообщения: 11.02.2013 23:28

Цитата:
find_files(L"C:\\WINDOWS\\");


Вообще-то эта системная директория, там может и не быть файлов с русскими символами.

Чтобы наверняка, делаем так:

//...
#include <stdio.h>
#include <fcntl.h> //add this one,
//...
//...
main()
{
_setmode(_fileno(stdout), _O_WTEXT); //and this,
find_files(L"C:\\руФайлыТут\\"); //and select a directory with ru files inside.
getchar();
}

, потом меняем фонт консоли на Lucida Console, чтобы всю эту красоту увидеть.
На выходе должно появится что-то похожее на:
C:\masm32\_my\todel>find
C:\руФайлыТут\ЕщёБольшеРУФаилов\ру3.txt
C:\руФайлыТут\ЕщёБольшеРУФаилов\ру4.txt
C:\руФайлыТут\ру1.txt
C:\руФайлыТут\ру2.txt
Автор: bomzzz
Дата сообщения: 14.02.2013 15:46
делаю для масм-а инклуды из библиотек наковыренных из студии. появляются вопросы по конфликтам. а как это в Си решено?
например как реализуется вызов функций fastcall (syscall)?
в библиотеке mapi32 переопределены функции с одинаковым именами например

Цитата:
MAPIInitialize PROTO C :VARARG
MAPIInitialize PROTO STDCALL :DWORD
MAPILogonEx PROTO C :VARARG
MAPILogonEx PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
MAPIOpenFormMgr PROTO C :VARARG
MAPIOpenFormMgr PROTO STDCALL :DWORD,:DWORD
MAPIOpenLocalFormContainer PROTO C :VARARG
MAPIOpenLocalFormContainer PROTO STDCALL :DWORD
MAPIUninitialize PROTO C :VARARG
MAPIUninitialize PROTO STDCALL

в библиотеках dplay.lib dplayx.lib переопределяются функции

Цитата:
DirectPlayCreate PROTO STDCALL :DWORD,:DWORD,:DWORD
DirectPlayEnumerateA PROTO STDCALL :DWORD,:DWORD

в Си что нибудь слышно по этому поводу?
хотелось бы определится что делать в этих ситуациях для корректности. маскировать их если да то как, а может просто выкинуть?
а то я в сишных инклудах вообще ни хрена понять не могу :)
Автор: akaGM
Дата сообщения: 14.02.2013 16:10
ну в каких-то случаях надо будет звать как
MYFUNC@20,
в каких-то
_myfunc

и чистить-не чистить стек...

в чём вопрос-то конкретно?
Автор: bomzzz
Дата сообщения: 14.02.2013 16:42
ну вот в этом и вопрос, например fastcall функции я экранировал @, а может лучше было @20 - для совместимости, а некоторые зареервированные названия в масме экранировал _ это видимо правильно

Добавлено:
MAPIUninitialize PROTO C :VARARG
MAPIUninitialize PROTO STDCALL

а в mapi32 наверно одну надо было экранировать _ , да вот как допереть какую
Автор: akaGM
Дата сообщения: 14.02.2013 17:01
не, увы, я не понимаю...
если написано
MAPIInitialize PROTO STDCALL :DWORD
то это строго (без алиасинга) MAPIInitialize@4
с прототипом в Си
STDAPICALLTYPE MAPIINITIALIZE(LPVOID что-то-там-4-байта)
и колах из масма без всякой заботой о стеке...

MAPIUninitialize PROTO C :VARARG

это _MAPIUninitialize
и с вызовом

call MAPIUninitialize
pop eax
Автор: bomzzz
Дата сообщения: 14.02.2013 17:51
у этих функций имя одинаковое что непонятного? я одну которая с сишным вызовом взял да викинул из инклуда и все остальные так же делают. но из того что вы тут говорите, получается надо было ту которая вараг экранировать _ . я это и спрашивал.
тогда получится единообразие, а если будет единообразие не вылезет какое нибудь како.

Добавлено:
вам инклуды сделал микрософт, они какими то соображениями пользовались глубину которых я никогда не постигну, вот я и спрашиваю как в си сделкано, чтоб в масме так же сделать. мы то сами инклуды делаем и библиотеки тоже
Автор: ne_viens
Дата сообщения: 14.02.2013 18:48
MAPIInitialize@4 и MAPIInitializе указывают на одну и ту-же функцию "int __stdcall MAPIInitializе(arg_0)".
Вторую можешь выкидывать из inc'а и оставить только MAPIInitialize PROTO STDCALL WORD

Очевидно, mapi32.dll собирали и с __declspec(dllexport) и с def файлом. Зачем, не известно.
Автор: bomzzz
Дата сообщения: 14.02.2013 18:57
я ее не из инка выкидываю, а составляю инк из экспорт листа. раз она экспортировалась отдельно, значит у нее отдельный вход, вполне возможно что он просто перепуливает туда не делая ничего но тем не менее чтоб ее выкинуть это надо проверить
Автор: ne_viens
Дата сообщения: 14.02.2013 19:07
Я проверил, там входы одинаковые и у f() и у f@().
Автор: bomzzz
Дата сообщения: 14.02.2013 19:23
во первых у них разные ординалы - порядковые нумера

Цитата:
20 _MAPIInitialize
21 _MAPIInitialize@4



Цитата:
68AC _MAPIInitialize
68AC __imp__MAPIInitialize
6918 _MAPIInitialize@4
6918 __imp__MAPIInitialize@4

и у них разные адреса входа - надо читать мсдн может это не то
http://support.microsoft.com/kb/177429/ru


Добавлено:
чета оно не дезасемблируется не статическая

Добавлено:

Цитата:
158 offsets

20 6BAC
21 799C

вот наверно смещение по ординалу

Добавлено:
вот у них сайзофдата точно разные

Цитата:
Version : 0
Machine : 14C (x86)
TimeDateStamp: 3B1470A9 Wed May 30 11:01:45 2001
SizeOfData : 0000001B
DLL name : MAPI32.dll
Symbol name : _MAPIInitialize
Type : code
Name type : ordinal
Ordinal : 20

Version : 0
Machine : 14C (x86)
TimeDateStamp: 3B1470A9 Wed May 30 11:01:45 2001
SizeOfData : 0000001D
DLL name : MAPI32.dll
Symbol name : _MAPIInitialize@4
Type : code
Name type : ordinal
Ordinal : 21
Автор: ne_viens
Дата сообщения: 14.02.2013 19:41
Автор: bomzzz
Дата сообщения: 14.02.2013 19:42

Цитата:
.386

.model flat, stdcall
option casemap :none

include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\user32.inc
include \MASM32\INCLUDE\kernel32.inc
includelib \MASM32\LIB\user32.lib
includelib \MASM32\LIB\kernel32.lib

.data
mestitle    db "Bomz",0
form        db "EAX: %010hu", 0
mapi32        db 'mapi32.dll',0
MAPIInitialize         db 'MAPIInitialize',0
MAPIInitialize@4    db 'MAPIInitialize@4',0

.data?
buffer        db 512 dup(?)

.code
start:
invoke LoadLibrary, addr mapi32
.if eax!=0
    mov ebx, eax
    invoke GetProcAddress, ebx, addr MAPIInitialize
    invoke wsprintf,ADDR buffer,ADDR form,eax
    invoke MessageBox,0,ADDR buffer,ADDR mestitle,MB_ICONASTERISK
    invoke GetProcAddress, ebx, addr MAPIInitialize@4
    invoke wsprintf,ADDR buffer,ADDR form,eax
    invoke MessageBox,0,ADDR buffer,ADDR mestitle,MB_ICONASTERISK
    invoke FreeLibrary, ebx
.else
    invoke MessageBox,0,0,0,0
.endif
invoke ExitProcess,0
end start


похоже правда одно и тоже - по крайней мере мне не приходит в голову как умулрится получить адрес первой с _ не работает

Добавлено:
а как по ординалу функцию вызвать?

Добавлено:

Цитата:
Если этот параметр - порядковое значение, оно должно находиться в младшем слове; старшее слово - должно быть нуль.


Добавлено:

Цитата:
    invoke GetProcAddress, ebx, 21
    invoke wsprintf,ADDR buffer,ADDR form,eax
    invoke MessageBox,0,ADDR buffer,ADDR mestitle,MB_ICONASTERISK
    invoke GetProcAddress, ebx, 20
    invoke wsprintf,ADDR buffer,ADDR form,eax
    invoke MessageBox,0,ADDR buffer,ADDR mestitle,MB_ICONASTERISK
    invoke FreeLibrary, ebx


100% это одно и тоже. бред какой то. как они эту библиотеку замастырили и где такая трава росла
Автор: AZJIO
Дата сообщения: 14.02.2013 21:32
bomzzz
Ты MASM по учёбе/работе изучаешь?
Автор: dimon0476
Дата сообщения: 14.02.2013 21:36

Цитата:
и где такая трава росла
Ну как где? Нашли в нужном поле, сами вырастили. А потом что с этой травой сделали....
Автор: bomzzz
Дата сообщения: 15.02.2013 05:32
возможно эти библиотеки еще делались на 98 винде и положим какая то идея была совместимости или инклудов не было еще, поэтому в кернеле32 есть
lstrlen
lstrlenA
lstrlew
первые две одно и тоже. mapi эту 32, может вообще кто то левый делал и кривой DEF составил. просто из за небольшого количества кривых либов, нужно придумывать алгоритм проверок, который будет потом тормозить на 99% либов.

а никто не подскажет как DEF файл с ординалами сделать? по нумеру то быстрее функцию вызывать чем по имени. это мне для своих дллок интересно
а в кернеле этом вообще ординалов нету

AZJIO

Цитата:
Ты MASM по учёбе/работе изучаешь?

нет. просто так, для дома для семьи. я других языков не знаю. в школе учил бейсик для Hewlett Packard, на Turbo сам программировал. потом операторы начал использовать прямые, потом команды для процессора, потом вставку сделал ассемблерную, а потом бейсик стал не нужен.
а после бейсика я Си понять не могу в упор. три раза пробовал начинать книжку читать и дуб дубом ниче в голову не лезет. три дня убил на то чтоб понять что за объекты такие, когда понял плюнул...
это как паскаль был и бейсик. вроде одно и тоже, а друг друга не понимали никогда. вот Си паскале видный язык. я последний год был когда на бейсике учили, следующие уже на паскале все. фортран еще был семестр в вузе - ну он на бейсик похож, я на первом занятии программу написал и больше не ходил. так же с ассемблером - никаких сложностей. никаких книжек не читал, просто пишу да и все со справочником под рукой

под виндой никакой разницы нет дельфи, си, ассемблер. паутину плетешь из апи функций. на асме примеров в инете мало постоянно использую коды на дельфи и си как примеры. пустячные функции расписываешь сам - на си тоже вставки делают ассемблерные. единственная серьезная разница - вещественные числа, но на масме всяких библиотек куча для fpu и прочего

Добавлено:
[more].386

.model flat, stdcall
option casemap :none

include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\user32.inc
include \MASM32\INCLUDE\kernel32.inc
includelib \MASM32\LIB\user32.lib
includelib \MASM32\LIB\kernel32.lib
include \MASM32\INCLUDE\fpu.inc
includelib \MASM32\LIB\fpu.lib

.data
mestitle    db "fpu",0
valueA        db '123.456',0
valueB        db '456.321',0

.data?
buffer        db 512 dup(?)
value1        real10 ?
value2        real10 ?

.code
start:
invoke FpuAtoFL,addr valueA,addr value1,DEST_MEM
invoke FpuAtoFL,addr valueB,addr value2,DEST_MEM
invoke FpuAdd,addr value1,addr value2,addr value1,SRC1_REAL OR SRC2_REAL OR DEST_MEM
invoke FpuFLtoA,addr value1,03h,addr buffer,SRC1_REAL OR STR_REG
invoke MessageBox,0,addr buffer,addr mestitle,MB_ICONASTERISK
invoke ExitProcess,0
end start[/more]

вот пример макрофункций готовых. я особой разницы не вижу, один раз написать конвертер строка-real10 потом все время им пользоваться, все равно с сопроцессором сидеть тупить и пока опыта набираешься щелкаешь мелкие задачки - вот у тебя и накопятся свои коды: длина строки, строка в число, число в строку... и вообще сейчас смысл на SSE напирать, а то AVX уже давно пора начинать изучать
http://rghost.ru/43806034
вот усложнил немного, от Си ничем не отличается только синтаксисом. конечно я бы строку собрал без апи - на каждый вызов апи уходит минимум 300-500 тактов, даже если она ничего не делает. плюс они универсальные, в них куча проверок, а реально от них обычно и половины не надо, так что сотни тактов заменяются на единицы-десятки частенько
http://rghost.ru/43806100
Автор: ne_viens
Дата сообщения: 15.02.2013 07:56

Цитата:
...как DEF файл с ординалами сделать?...


LIBRARY MAPI32
EXPORTS MAPIInitialize @20
Автор: bomzzz
Дата сообщения: 15.02.2013 08:12
а запятой точно не надо? а по ординалам потом только через GetProcAddress?
а в INC ординал можно включить?

масме так уж принято , сначала делать из микрософтовских либов инки, инки править, а потом из инков делать либы. это сокращает размер дистрибутива (он без либов), устраняет ненужное из либов, и есть даже один конфликтый либ который все равно надо переделывать.
Автор: bomzzz
Дата сообщения: 15.02.2013 10:20
вот чем мне Си нравица - сишники во всем рубят. а по масму можно только на аглицком что то разузнать
Автор: AZJIO
Дата сообщения: 15.02.2013 10:50
bomzzz
Я спросил потому что если по работе требуется, то тут никуда не денешся, а если для себя то попробуй AutoIt3, как наиболее интуитивный и позволяет за короткое время получить желаемый результат. Более сложный, но опять же прост в понимании PureBasic. Честно говоря я даже сейчас не уверен что хочу изучать С++, потому что уровень не позволяет и не вижу форумов с активным обсуждением. Справочного материала тоже толкового ещё не нашёл, читаю Полный справочник по C, как наиболее доступный для понимания. Подумал может создать и скомпилировать справку в стиле справки AutoIt3. Позволило бы в процессе и учится. В данный момент в AutoIt3 я могу двумя кликами выделить слово под курсором (в редакторе) и горячей клавишей прыгнуть в справку на страницу функции что под курсором и почитать поправки, если что подзабыл, а в справке кликом на кнопке выполняется пример, а клик на названии функции в коде справки вызывает переход к этой функции. Такая интерактивность позволяет быстро изучать.
Автор: ne_viens
Дата сообщения: 15.02.2013 10:52
>bomzzz
Без EN трудно будет и на MASME, и на C, и на других языках тоже.


Цитата:
а по ординалам потом только через GetProcAddress?


Можно и линковать (например, "cl myprog.c ordinalExported.lib").


Цитата:
а в INC ординал можно включить?


Inc тут не причём- это только линкера касается.
И не надо всё поголовно incовать- понадобилась ф-я (например, А_SHAInit() из advapi32.dll), eё и разбери, посмотри сколько параметров, какое соглашение вызова, потом уже пиши в inc, a далее уже в lib.
Автор: AZJIO
Дата сообщения: 15.02.2013 11:12
bomzzz
Если надумаешь, вот тема AutoIt3
Автор: bomzzz
Дата сообщения: 15.02.2013 12:26
ну это надо же целый язык учить отдельный узкопрофильный. наверняка на вбс скрипты похожий опять с этими объектами. я так любительски занимаюсь, для развлечения. реальная практическая задача редко выпадает.

на Си это ты зря вот по Си никаких проблем нету ни с помощью, ни с примерами.

ассемблер не сложный язык, наоборот самый простой, потому что близок к машинному, а все остальные тоже самое делают только через ж. и гибкости у него больше чем у батников
Автор: AZJIO
Дата сообщения: 15.02.2013 14:27
bomzzz
Если ты изучаешь высокоуровневый язык, то работаешь с готовыми объектами, если тебе недостаточно или хочешь улучшить, то изучаешь в инклюдах эти объекты и далее если и этого не достаточно, то изучаешь язык на котором написан высокоуровневый язык. Если делать всё наоборот, то ты сначала не имеешь ничего, кроме выполнения сложения чисел и можешь не дорасти до создания чего-то, потому что проще использовать готовое.


Цитата:
на Си это ты зря вот по Си никаких проблем нету ни с помощью, ни с примерами.
и где доказательство слов? Вот что я имею
На AutoIt3 все примеры сразу в справке и там же кнопка на их запуск и копирование, причём все примеры рабочие, сразу хочется складывать как конструктор. Что я вижу в Си, 3 страницы текста на форуме, чтобы получить функцию поиска файлов в примитивном виде, напиши это вопрос на форуме AutoIt3, тебе сразу предложат минимум 3 варианта и кучу подвариаций.


Цитата:
наверняка на вбс скрипты похожий опять с этими объектами
с объектами там IE и др., это просто расширяет возможности использования объекта, а в остальном упрощённые обёртки сложных функций. Если сравнивать с вбс, то вряд ли стиль вбс является таким же удобным, я даже батники не мог понять с их форматом записи цикла.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


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