Передача и возврат строк в/из dll.Сохранение строк в dll

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
PPDing
13
PPDing  
Нужно передать строки в 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];
}

Если нужно использовать структуру MqlString то как именно.
Maxim Kuznetsov
13781
Maxim Kuznetsov  
PPDing:
Нужно передать строки в 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];
}

Если нужно использовать структуру MqlString то как именно.

передавать строки в 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);

PPDing
13
PPDing  

Слишком уж заморочно, из строки делать массив, передавать, потом все обратно.Я как то делал попроще, но забыл.

Сигнатура функции в MQL:

#import "mql4bufer.dll"
 
  void    setvalue_ss(string namev,string newvalue);
  string  getvalue_ss(string namev);
 
#import

вызов:

string txt;

txt = getvalue_ss("name1");

Рабочая dll есть, кода нет.

Maxim Kuznetsov
13781
Maxim Kuznetsov  
PPDing:

Слишком уж заморочно, из строки делать массив, передавать, потом все обратно.Я как то делал попроще, но забыл.

Сигнатура функции в 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`ом место.

PPDing
13
PPDing  
Maxim Kuznetsov:

заморочено потому как 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; пока не получается.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий