Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

Crazy_Shrike



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопросы по программированию на C/С++

 
  • Справочники, книги
  • Выбор IDE (среды программирования)
     
    Постарайтесь дать как можно больше информации о возникшей проблеме - это в конце концов в ваших же интересах чтобы вам помогли.

    Решения конкретных задач собираются и обсуждаются в теме Задачи по C/С++ .

    Прежде чем просить помощи в задании...
    Если позарез надо и вы даже готовы заплатить

    Как правильно задавать вопросы, если вы хотите получить ответ.

    Полезные ссылки:
    C++(eng)

  • Всего записей: 241 | Зарегистр. 25-03-2004 | Отправлено: 13:37 06-05-2004 | Исправлено: AZJIO, 19:45 12-05-2014
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    типа статическая библиотека? но все равно приложение тяжелое получится
     
    Добавлено:
    помогите пожалуйста. с 13 компилятором cl и link от 10 студии все работает. не получается приручить cl от 10 студии, все файлы в папке bin= лежат. пишет не могу c1.dll запустить
    http://rghost.ru/43721046
    хочется выкинуть из студии все лишнее. она на диске гига 4 занимает и еще фреймворки гиг не меньше

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 17:22 11-02-2013 | Исправлено: bomzzz, 18:29 11-02-2013
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Инлаин- просто вставляется инструкции 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%
     

    Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 18:33 11-02-2013 | Исправлено: ne_viens, 19:26 11-02-2013
    dimon0476



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Можно подсказать: можно ли найти Microsoft Visual Studio С++ 2008 Standart Edition оригинальный образ? Можно ли сравнить контрольные суммы с сайтом МС? Какие дополнительные возможности дает Стандарт перед Експресс? Спасибо за ответ.

    ----------
    "Мы часто воспринимаем полутораумных людей как полоумных, потому что нам доступна лишь треть их ума."

    Всего записей: 1641 | Зарегистр. 16-04-2012 | Отправлено: 19:17 11-02-2013
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 19:31 11-02-2013 | Исправлено: bomzzz, 19:43 11-02-2013
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Никто не мешает писать так:
     
    #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.

    Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 19:50 11-02-2013
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ага. вот так лучше - знакомо и понятно

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 19:55 11-02-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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();
    }

     

     
    файлы с рускими символами не находит.

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 21:11 11-02-2013 | Исправлено: AZJIO, 21:20 11-02-2013
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
        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

    Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 01:28 12-02-2013 | Исправлено: ne_viens, 01:32 12-02-2013
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    делаю для масм-а инклуды из библиотек наковыренных из студии. появляются вопросы по конфликтам. а как это в Си решено?
    например как реализуется вызов функций 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

    в Си что нибудь слышно по этому поводу?
    хотелось бы определится что делать в этих ситуациях для корректности. маскировать их если да то как, а может просто выкинуть?
    а то я в сишных инклудах вообще ни хрена понять не могу :)

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 17:46 14-02-2013 | Исправлено: bomzzz, 17:49 14-02-2013
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ну в каких-то случаях надо будет звать как
    MYFUNC@20,
    в каких-то
    _myfunc
     
    и чистить-не чистить стек...
     
    в чём вопрос-то конкретно?

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 18:10 14-02-2013 | Исправлено: akaGM, 18:11 14-02-2013
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ну вот в этом и вопрос, например fastcall функции я экранировал @, а может лучше было @20 - для совместимости, а некоторые зареервированные названия в масме экранировал _ это видимо правильно
     
    Добавлено:
    MAPIUninitialize PROTO C :VARARG
    MAPIUninitialize PROTO STDCALL  
     
    а в mapi32 наверно одну надо было экранировать _ , да вот как допереть какую

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 18:42 14-02-2013
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    не, увы, я не понимаю...
    если написано
    MAPIInitialize PROTO STDCALL :DWORD  
    то это строго (без алиасинга) MAPIInitialize@4
    с прототипом в Си
    STDAPICALLTYPE MAPIINITIALIZE(LPVOID что-то-там-4-байта)
    и колах из масма без всякой заботой о стеке...
     
    MAPIUninitialize PROTO C :VARARG
     
    это _MAPIUninitialize
    и с вызовом
     
    call MAPIUninitialize
    pop eax

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 19:01 14-02-2013
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    у этих функций имя одинаковое что непонятного? я одну которая с сишным вызовом взял да викинул из инклуда и все остальные так же делают. но из того что вы тут говорите, получается надо было ту которая вараг экранировать _ . я это и спрашивал.
    тогда получится единообразие, а если будет единообразие не вылезет какое нибудь како.
     
    Добавлено:
    вам инклуды сделал микрософт, они какими то соображениями пользовались глубину которых я никогда не постигну, вот я и спрашиваю как в си сделкано, чтоб в масме так же сделать. мы то сами инклуды делаем и библиотеки тоже

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 19:51 14-02-2013
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MAPIInitialize@4 и MAPIInitializе указывают на одну и ту-же функцию "int __stdcall MAPIInitializе(arg_0)".
    Вторую можешь выкидывать из inc'а и оставить только MAPIInitialize PROTO STDCALL WORD
     
    Очевидно, mapi32.dll собирали и с __declspec(dllexport) и с def файлом. Зачем, не известно.

    Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 20:48 14-02-2013 | Исправлено: ne_viens, 20:51 14-02-2013
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    я ее не из инка выкидываю, а составляю инк из экспорт листа. раз она экспортировалась отдельно, значит у нее отдельный вход, вполне возможно что он просто перепуливает туда не делая ничего но тем не менее чтоб ее выкинуть это надо проверить

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 20:57 14-02-2013
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я проверил, там входы одинаковые и у f() и у f@().

    Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 21:07 14-02-2013
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    во первых у них разные ординалы - порядковые нумера

    Цитата:
                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

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 21:23 14-02-2013
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 21:41 14-02-2013
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    .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% это одно и тоже. бред какой то. как они эту библиотеку замастырили и где такая трава росла

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 21:42 14-02-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    bomzzz
    Ты MASM по учёбе/работе изучаешь?

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 23:32 14-02-2013
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru