DLL и консоль

Тема в разделе "WASM.BEGINNERS", создана пользователем spa, 29 фев 2008.

  1. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Какой самый простой способ вывода в консоль (создавть ее тоже надо из DLL) причем очень желательно чтобы была возможность вывода с помощбю printf(). Просто небольшой лог будет наиблолее удобней сделать именно консолью.
     
  2. slow_at_work

    slow_at_work New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    64
    А мне кажется, что удобнее писать лог в файл.
    А так то - AllocConsole (для создания новой)/AttachConsole(для получения доступа к существующей консоли любого процесса, но требует минимум wxp) и не забываем что у процесса м.б. не более одной консоли
     
  3. LazzY

    LazzY New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2006
    Сообщения:
    123
    мм.. ну можно RichEdit заюзать а-ля консоль.. имитацию консоли сделать чтоле
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    В принцепе я разобрался, но никто не подскажет как мне вызвать из DLL fprintf();?

    Просто прога компилируеться нормально все норм, но консоль мигает и пропадает код что-то вроде этого:

    Код (Text):
    1. #include <windows.h>
    2. #include<stdio.h>
    3. #pragma comment (lib, "user32.lib")
    4. #pragma comment (lib, "KERNEL32.LIB")
    5. #pragma comment (lib, "advapi32.LIB")
    6. #pragma comment(linker,"/SUBSYSTEM:WINDOWS")
    7. #pragma comment(linker,"/ENTRY:main")
    8.  
    9. LPDWORD y;
    10.  
    11. int main(HINSTANCE hDLL,DWORD Reason,LPVOID Reserved)
    12. {
    13.     if(Reason==DLL_PROCESS_ATTACH)
    14.     {
    15.     //  _asm { int 3 }
    16.     AllocConsole();
    17.     HANDLE c= GetStdHandle(STD_OUTPUT_HANDLE);
    18.     WriteFile(c,"WriteFile", 5, y ,NULL );
    19.     fprintf((FILE *)c,"fprintf");
    20.            Sleep(1000);
    21.     }
    22.  
    23.  
    24. }
    Выводиться лишь WriteFile, и то программа сразу завершаеться

    Я предпологаю чтото с #pragma comment(linker,"/ENTRY:main") надо мутить )
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    надо прочитать что такое хендл, и чем он отличается от указателя.
     
  6. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    n0name
    FILE * - это фактически хендел ;)
    А во вторых почему консоль сразу закрываеться, ведь если вы и правы что дело в "хенделе" то почму просто ф/я не возвращает ошибку? Да и мне странно FILE * называть указателем, куда он по вашему указывает?
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    На структуру FILE в соответствующем пуле.

    Не корректное сравнение. FILE содержит хендл и кучку другой инфы о файле. По сути, тебе нужно разобраться в файловом IO сей и понять, чем отличаются FILE*, STD_*_HANDLE и HANDLE. Плюс ко всему, нужна инициализация file io части CRT, чтобы корректно работали функции.

    А инициализация проста на самом деле:
    Код (Text):
    1.     AllocConsole();
    2.     freopen("CONOUT$", "wt", stdout);
    3.     printf("Hello\n");
    Либо смотреть тут.
     
  8. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    IceStudent
    Спасбо и за ссыль и за пример, и за разьеснения, но почемуто не работает не вашь пример не тот который у МС, мб котнечно это я косячу, но если это возможно полностью рабочий пример.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    SPA
    Разбирайся, у меня работает:
    Код (Text):
    1. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
    2.     cmp [fdwReason],DLL_PROCESS_ATTACH
    3.     jne     @F
    4.         invoke AllocConsole
    5.         mov     edx,[_iob]
    6.         add     edx,sizeof.FILE
    7.         invoke freopen,szCon,szWt,edx
    8.         invoke printf,szHello
    9. @@:
    10.     mov eax,TRUE
    11.     ret
    12. endp
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    какая новость, надеюсь в microsoft'e об этом знают?
    советую глянуть в сорцы crt на структуру _FILE.
     
  11. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    n0name
    Ты меня конечно извини, но какое определение хендела дашь тем оно и будет являться, я дал такое: некоторое число которое однозначно соответцтвует некоторой структуре описывающей что либо, это может быть как указатель так и индекс в некотором массиве... Если я не прав, вероятнось чего я ни когда не отрицаю, то просто я не прав и это не о чем не говорит, и ничего не доказывает вот и все!
     
  12. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    IceStudent
    Вот я вернулся к этому вопросу )
    можно узнать а какие freopen и printf Вы юзаите?

    PS видимо я просто перемудрил )

    PSS понял более-мение разницу между хенделом и "указателем" на файлик
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Стандартные.
     
  14. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    IceStudent
    Прошку прошение, за "наглость" можно прям рабочий пример, или скомпилированный, просто я что-то не так понял и всяко разно не получаеться.

    PS наверное 2-х месячная сесия плохо отразилась