Нужно передать строки в dll и сохранить там, затем считать.
Делал так числа сохраняются строки нет :
Код MQL4:
#import "mql4_save_str.dll"
int getsi(string key);
void setsi(string key, int v1);
string getss(string key);
void setss(string key, string v1);
#import
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
void OnStart()
{
setsi("key1",58578);
Print(getsi("key1"));
setss("key2","строка");
Print(getss("key2"));
}
Код dll:
#include "stdafx.h"
#include <map>
using namespace std;
map <wchar_t, wchar_t > maps;
map <wchar_t, int> mapi;
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
__declspec(dllexport) void __stdcall setss(wchar_t* key, wchar_t* value)
{
maps[*key] = *value;
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
__declspec(dllexport) wchar_t* __stdcall getss(wchar_t* key)
{
map <wchar_t, wchar_t >::iterator cur;
cur = maps.find(*key);
if (cur == maps.end())
{
return L"";
}
return &maps[*key];
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
__declspec(dllexport) void __stdcall setsi(wchar_t* key, int value)
{
mapi[*key] = value;
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
__declspec(dllexport) int __stdcall getsi(wchar_t* key)
{
return mapi[*key];
}
передавать строки в DLL легко - они туда прилетают как wchar_t *
а вот обратно - можно только заполняя заранее выделенный байтовый массив
__declspec(dllexport) int __stdcall GetTheString(uchar *arr,int arrLen); // заполнить arr символами-байтами и вернуть длину заполнения в байтах
а потом в MQL - через CharArrayToString делать из него привычную для MQL строку
uchar arr[255];
int len=GetTheString(arr,255);
string str=CharArrayToString(arr,0,len);
Слишком уж заморочно, из строки делать массив, передавать, потом все обратно.Я как то делал попроще, но забыл.
Сигнатура функции в MQL:
#import "mql4bufer.dll"
void setvalue_ss(string namev,string newvalue);
string getvalue_ss(string namev);
#import
вызов:
string txt;
txt = getvalue_ss("name1");
Рабочая dll есть, кода нет.
Слишком уж заморочно, из строки делать массив, передавать, потом все обратно.Я как то делал попроще, но забыл.
Сигнатура функции в MQL:
#import "mql4bufer.dll"
void setvalue_ss(string namev,string newvalue);
string getvalue_ss(string namev);
#import
вызов:
string txt;
txt = getvalue_ss("name1");
Рабочая dll есть, кода нет.
заморочено потому как MQL сам управляет памятью и ссылками. Вы не можете в DLL выделить кусок памяти так чтобы далее этим куском рулила платформа. API DLL должны возвращать скаляры, а всё прочее (массивы/структуры/строки) только копируя в предоставленное caller`ом место.
заморочено потому как MQL сам управляет памятью и ссылками. Вы не можете в DLL выделить кусок памяти так чтобы далее этим куском рулила платформа. API DLL должны возвращать скаляры, а всё прочее (массивы/структуры/строки) только копируя в предоставленное caller`ом место.
c++ знаю плохо, особенно про выделение памяти, ссылки, но вроде понял.
Вот такой вариант работает без массива, насколько он корректен ?
__declspec(dllexport) wchar_t* __stdcall get_wchar_t(wchar_t* s1, wchar_t* s2)
{
wcscat(s1, L" stroka3 ");
wcscat(s1, s2);
return s1;
}
mql4:
string s1;
string s2;
s1 = "stroka1";
s2 = "stroka2";
Print(get_wchar_t(s1,s2));
Print(s1);
с сохранением строк в map <wchar_t, wchar_t > maps; пока не получается.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Делал так числа сохраняются строки нет :
Код MQL4:
#import "mql4_save_str.dll"
int getsi(string key);
void setsi(string key, int v1);
string getss(string key);
void setss(string key, string v1);
#import
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
void OnStart()
{
setsi("key1",58578);
Print(getsi("key1"));
setss("key2","строка");
Print(getss("key2"));
}
Код dll:
#include "stdafx.h"
#include <map>
using namespace std;
map <wchar_t, wchar_t > maps;
map <wchar_t, int> mapi;
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
__declspec(dllexport) void __stdcall setss(wchar_t* key, wchar_t* value)
{
maps[*key] = *value;
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
__declspec(dllexport) wchar_t* __stdcall getss(wchar_t* key)
{
map <wchar_t, wchar_t >::iterator cur;
cur = maps.find(*key);
if (cur == maps.end())
{
return L"";
}
return &maps[*key];
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
__declspec(dllexport) void __stdcall setsi(wchar_t* key, int value)
{
mapi[*key] = value;
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
__declspec(dllexport) int __stdcall getsi(wchar_t* key)
{
return mapi[*key];
}