Консоль из DLL

 
Всем привет. А как сделать так, чтобы когда я из MQL4 вызываю dll на C++, срабатывал cout из этой dll в консоли. В общем мне нужно выводить сообщение в консоль
 
Сделать консольное приложение и вызывать из dll это приложение.
 
Ihor Herasko:
Сделать консольное приложение и вызывать из dll это приложение.
Но мне нужно проверять значения в самой dll, сделать наподобие Alert
 

dll не должна иметь доступа к консоли, к консоли имеют доступ приложения запущенные из консоли

т.е. нужно из dll сначала запустить консоль, получить к ней доступ и потом лишь писать туда что-нибудь

мутно все это, сделайте лучше окошко WinForms из dll и пишите туда что вздумается

ЗЫ: под МТ5 не сложно, за 10 минут написал на работе вывод в лог на C#  https://www.mql5.com/ru/forum/329730/page2#comment_14471168 

ЗЫЗЫ: с МТ4 эти задачи много стоят, сколько раз делал свои хотелки, то что делаешь под МТ5 за час - два, ну за день может, под МТ4 уже готовый проект под 32 сконвертировать.... всегда что то начинается не так, и времени уходит столько же сколько с нуля писал

 
Murat Ishakov:
Всем привет. А как сделать так, чтобы когда я из MQL4 вызываю dll на C++, срабатывал cout из этой dll в консоли. В общем мне нужно выводить сообщение в консоль

в своей-же DLL перенаправить вывод cout/cerr в отдельные файлы, а на уровне MQL (например индикатором) эти файлы читать и с@ать в консоль. Кому повезло осилить Linux могут воспользоваться tail -f чтобы видеть итог

насколько понимаю (не силён в WinAPI) дескрипторы 0 1 2 закрываются вот прямо сразу и не наследуются или сливаются в nul . И то что видится в журнале - это не вывод cout, это результат вызова отдельных функций платформы

 
Murat Ishakov:
Всем привет. А как сделать так, чтобы когда я из MQL4 вызываю dll на C++, срабатывал cout из этой dll в консоли. В общем мне нужно выводить сообщение в консоль
AllocConsole(), ну и дальше в msdn читай как с этим работать
 
Vladimir Simakov:
AllocConsole(), ну и дальше в msdn читай как с этим работать

прогуглил, действительно не сложно на C++ 

#include "stdafx.h"
#include "testdll.h"


BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                                         )
{
    switch (ul_reason_for_call)
        {
                case DLL_PROCESS_ATTACH:
                case DLL_THREAD_ATTACH:
                case DLL_THREAD_DETACH:
                case DLL_PROCESS_DETACH:
                        break;
    }
    return TRUE;
}



HANDLE hOut=NULL;
extern "C"
        {
__declspec(dllexport) void CreateConsole()
        {
        if(hOut==NULL)
                {
                AllocConsole();
                hOut = GetStdHandle(STD_OUTPUT_HANDLE);
                }
 
        }

__declspec(dllexport) void DestroyConsole()
        {
        if(hOut!=NULL)
                {
                FreeConsole();
                hOut = NULL;
                }

        }


__declspec(dllexport) void PrintOnConsole(char *pTxt)
                {
                DWORD NumberOfCharsWritten;
                WriteConsole(hOut, pTxt,lstrlen(pTxt),&NumberOfCharsWritten, NULL);
                }
        }

вызов

#include "stdafx.h"

extern "C" __declspec(dllimport) void PrintOnConsole(char *pTxt);
extern "C" __declspec(dllexport) void CreateConsole();
extern "C" __declspec(dllexport) void DestroyConsole();

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
        {
        CreateConsole();
        PrintOnConsole("TEST");
        MessageBox(NULL,"Console test","Console test",MB_OK);
        DestroyConsole();
        return 0;
        }


как говорится, удивительное рядом )))