Вверх ↑
Ответов: 176
Рейтинг: 12
#1: 2011-09-04 00:20:12 ЛС | профиль | цитата
совершено верно. Ведь передается указатель. Но нужно, чтобы эти данные не изменялись при изменений edit
------------ Дoбавленo в 17.13:
Но у меня всё равно никак не работает. Даже если сначала запихнуть данные в стринговую переменную, а потом передать указатель на неё в dll...
Видео - http://forum.hiasm.com//getfile/25075
------------ Дoбавленo в 20.20:
Ура! Решено! Всётаки HiAsm победил в схватке. Переделал dll. Сделал, чтобы в общей памяти хранился не указатель на строку, а сама строка. Не хотелось добавлять в dll тип string, но пришлось. Может кому понадобится её код:

#include "stdafx.h"
#include <iostream>

#define MT4_EXPFUNC __declspec(dllexport)

using namespace std;

#pragma data_seg(".shared")
#pragma comment(linker,"/SECTION:.shared,RWS")
#pragma data_seg()
__declspec(allocate(".shared")) string SharedStrVar1, SharedStrVar2;
__declspec(allocate(".shared")) int SharedIntVar1, SharedIntVar2;

// Строковые переменные
MT4_EXPFUNC void __stdcall SharedStrVarSet(char *InTxt, int i)
{
string InStr;
InStr = InTxt;

switch(i)
{
case 0:
SharedStrVar1 = InStr;
break;
case 1:
SharedStrVar2 = InStr;
break;
}
}

MT4_EXPFUNC char* __stdcall SharedStrVarGet(int i)
{
std::string str1(SharedStrVar1);
std::string str2(SharedStrVar2);
char* s1 = new char[str1.length()+1]();
char* s2 = new char[str2.length()+1]();
strcpy(s1, str1.c_str());
strcpy(s2, str2.c_str());

char* out;
switch(i)
{
case 0:
out = s1;
break;
case 1:
out = s2;
break;
}
return (out);
}

// Переменные целых чисел
MT4_EXPFUNC void __stdcall SharedIntVarSet(int InInt, int i)
{
switch(i)
{
case 0:
SharedIntVar1 = InInt;
break;
case 1:
SharedIntVar2 = InInt;
break;
}
}

MT4_EXPFUNC int __stdcall SharedIntVarGet(int i)
{
int out;
switch(i)
{
case 0:
out = SharedIntVar1;
break;
case 1:
out =SharedIntVar2;
break;
}
return out;
}
------------ Дoбавленo в 20.35:
А вот и ролик, демонстрирующий работу Shared переменных. Через общую dll данные в переменных доступны из разных процессов. Чтобы общие переменные работали, нужно копировать dll в windows/system32
funccallsharelvar.rar
------------ Дoбавленo в 00.20:
Рано радуюсь. С короткими строками всё заработало, а вот длинные приводят к ран тайм еррору. Вычитал вот это:

[offtop]Общий менеджер памяти

Если выделение и освобождение динамической памяти явно или неявно поделены между библиотекой и программой, то и в библиотеке, и в программе следует обязательно подключить модуль ShareMem. Его нужно указать в секции uses первым, причем как в библиотеке, так и в использующей ее программе.

Модуль ShareMem является модулем импорта динамически загружаемой библиотеки Borlndmm.dll, которая должна распространяться вместе с вашей программой. В момент инициализации модуль ShareMem выполняет подмену стандартного менеджера памяти на менеджер памяти из библиотеки Borlndmm.dll. Благодаря этому библиотека и программа могут выделять и освобождать память совместно.

Модуль ShareMem следует подключать еще и в том случае, если между библиотекой и программой происходит передача длинных строк или динамических массивов. Поскольку длинные строки и динамические массивы размещаются в динамической памяти и управляются автоматически (путем подсчета количества ссылок), то блоки памяти для них, выделяемые программой, могут освобождаться библиотекой (а также наоборот). Использование единого менеджера памяти из библиотеки Borlndmm.dll избавляет программу и библиотеку от скрытых разрушений памяти.[/offtop]

Прописал в IC в секции uses ShareMem, теперь компилятор требует файл ShareMem.dcu. Искал на просторах интернета, не могу найти, где скачать. Может у кого завалялся?
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
файлы: 2callfuncvideo2.rar [3MB] [268], funccallsharelvar.rar [2.3MB] [175]