MQL4 & Visual C++2013 DLL with string

I’ll show you here a useful ‘dll’ for MQL4 of MetaTrader4 for Windows.
You may need ‘VisualStudio2013 & C++’. of course also MT4.
At first, I introduce you some helpful web sites below; Many thanks to these genius authors!!.

Basic References MSDN References for VisualC++ Mr. roberr C++ entrance

Modern Coding C++ Modern C++ Mr.Yamamoto(Cyboze co Ltd) ModernC++11,14 std namespace ? what is that

Stream Stream general help Stream basic filestream basic file coding

Unicode specific Code general Unicode problem Unicode problem TCHAR coding TCHAR Coding for file handle character code of filename, references on windows file system version(unicode,sjis Japanese)

MT4’mql+dll’ Mr.amenbo Helpful document with 4step development method Document about MQL4 and DLL export table

Test fo file handling and string transition

I chose the 4 step method suggested by Mr.amenbo(see link), and add a bit shortcut.
The step 1 is same as original idea, so let’s begin.
I wrote ‘test.cpp’ as my solution name, but you can change as you like, within coding regulations.
‘%…%’ mean replace proper string.
Many impressive site are exist, but difficult for beginners. My comments in the .cpp code below might be helpful for your .dll coding for MQL4. Because I spend huge hours to understand how to call dll from MQL4. If you like this message, please give me your expected expenses.
You may try this code at a debug mode. Push ‘local debugger’ and you can see a console window and prompt on the window.
Here, step 1 must be complete, easy? or difficult?
If you have question, please comment to this message. I don’t receive any e-mail from unknown person.
Finally some important notices, I cannot speak english, as you know?… and I’m a native japanese living in Japan.

Step 1-1 Create full code on C++

// test.cpp : Test for Console application for MT4
#include "stdafx.h" // you need add other header below in this headerfile
// #include "targetver.h"
// #include <tchar.h>
// #include <locale>
// #include <string>
// #include <fstream>
// #include <iostream>
// #include <stdexcept>
// #include <limits>
#if defined(_UNICODE) || defined(UNICODE)
# define tcout std::wcout
# define tcin std::wcin
# define tcout std::cout
# define tcin std::cin

typedef std::basic_string<_TCHAR> tstring;
typedef std::basic_ifstream<_TCHAR> tifstream; // file in stream
typedef std::basic_stringstream<_TCHAR> tstringstream; // string in stream

_TINT no; //Just for debugging

_TCHAR* hello(_TCHAR *file_name); //prototype statement

_TINT _tmain(_TINT argc, _TCHAR* argv[]){
    _tsetlocale(LC_ALL, _T("ja-JP")); //locale is important, don't forget

    _TCHAR file_name[] = _T("% fullpath and filename here %");
    tcout << hello(file_name);
    tcin >> no; // test use only, just for prevent close console window
    return 0;
//+---------- function-------------------------------------------+
_TCHAR* hello(_TCHAR *file_name){
// return and pass is both 'char pointer', it's important
tstring s; // string
tstring ss; // if you need formatted string, you can use 'tstringstream'
FILE *fs;
errno_t err;
err= _tfopen_s(&fs, file_name, _T("rt, ccs=UNICODE"));

// open err
if (err != 0){
    return _T("fail not open that file"); //takecare, file exist?
    // success open file
    tifstream ifs(fs); // make a filestream
    while (ifs >> s){ // you don't need use 'getline' method
        ss += s; // just for string case. if you want to use stream...
        // ss << s; // like this.
tcout << ss; //just for this test, strip this line when you copy to dll code.
_TCHAR out[1000]; //no intention this number, not too short and not too much
err = _tcscpy_s(out, 1000, ss.c_str()); //also above
if (err == 0){
    static _TCHAR *outp = out; //keep address for MQL4
    return outp;
    else return _T("copy fail");

Step1-2 Create MQL side code

This is an alternate method on Mr.amenbo’s.
The interface of mql and dll is quite easy. if you put ‘string’ to dll, the mql send that as a pointer to that string to dll. Dll receive as it, and then return pointer, and the mql take that as string with pointer. So you don’t need create ‘call program’ as step3 in the Mr.amenbo’s method.
And there is one tip, ‘Alert’ method in mql do not work well, that title is ok, but contents may fail to draw proper character.
If you can correct that problem, please tell me how to do that.
Partially, I choose the ‘MessageBoxW’ with windows API, imported by WinUser32.mqh.

//| test.mq4 |
//| Copyright 2015, UHL Software Corp. |
//| |
#property copyright "Copyright 2015, UHL Software Corp."
#property link ""
#property version "1.00"
#property strict
#include <stdlib.mqh>
#include <winuser32.mqh>
#import "test.dll"
string hello(string); //put filename type 'string' and get data as 'string' in facto pointer
#property script_show_inputs
//| Script program start function |
input string InpFilter="*";
void OnStart(){
    string file_name; //NTFS=unicode、FAT=sjis
    int i=1;
    long search_handle=FileFindFirst(InpFilter,file_name);
        //PrintFormat("%d : %s name = %s",i,GetLastError()==5018 ? "Directory" : "File",file_name); //just for debug
    //--- executional code ---
    string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH); //search install path
    file_name=terminal_data_path+"\\MQL4\\Files\\"+file_name; //test pattern
    //--- close search handle
    //PrintFormat("fullpath in MQL4: %s",file_name); //just for debug
    string ret=hello2(file_name);
    MessageBoxW(0,ret,ret,flg); //I cannot solve the 'alert' problem, so I use a windowsAPI on user32.dll, see header file
    //Alert(ret); //You may see an error with character code problem
    else Print("Files not found");

Step2 Create dll code

Important note is just below;
1) #define MT4_EXPFUNC __declspec(dllexport)
2) __stdcall
That is it.

1) Copy the header and target function code from full code create above.
//+———- function——————————————-+
_TCHAR* hello(_TCHAR *file_name){……

2) Change that title of target function to below.
MT4_EXPFUNC _TCHAR* __stdcall hello(_TCHAR *file_name){……

3 Set build mode to ‘Release’, and select menu project>property>, and set ‘Structure Property>c++>code create-runtime library’ to ‘multiple sleds(/MT)’.

4 Build it.

You don’t need to create module definition (.def) file. (at least on VC++2013 ? I’m not sure in facto… Please tell me genius wizard)

Step3 Test!!

Did you make it?
If you missed it, let’s work harder. Please leave a message to this article.

2 replies on “MQL4 & Visual C++2013 DLL with string”

hello im really new on c++ and have a little mql4 experience. my goal ist it to import some windows api things. im searching now for over 1 week for a solution and i found now your guide. can u post pls the complete code of the dll file? i have big problems to undestand how it will be watched on end. i translated the japanese MT4 pdf in german with a tool, but the translation makes me confuse 🙂
domo arigato gosaimazu!
greetings from germany.

i tryed to post my code here but your page give mes a error than

Guten Tag.
Thank you leaving a comment and requests. It’s very my pleasure own site would be seen from around the world.
Unfortunately, i’m a hobby programmer, and not doing programming so long since i wrote the article. So i cannot recall my memory even my own code.

Anyway, I will recommend the sample code of MQL4>Scripts>Examples>DLL>DLLSample.cpp. that is quite understandable and easy to analyze codes.

MQL4 calls “WinUser32.mql”-see Include folder- . That contains #import user32.dll which is body of WindowsAPI. So you have to write a proper header line on “WinUser32.mqh”.
MSDN will good help for this kind of problem.

I wish you become the one fx wizard.
I want to comeback fx trade after finish my work.

May the force be with you.

Vielen Dank auf Wiedersehen.

Leave a Reply

Your email address will not be published. Required fields are marked *