В архиве call_func_dll.rar схема и dll.
Код dll на C++
#cpp
#include "stdafx.h"
#define MT4_EXPFUNC __declspec(dllexport)
#pragma data_seg(".shared")
#pragma comment(linker,"/SECTION:.shared,RWS")
#pragma data_seg()
__declspec(allocate(".shared")) char *SharedStrVar1, *SharedStrVar2;
__declspec(allocate(".shared")) int SharedIntVar1, SharedIntVar2;
// Строковые переменные
MT4_EXPFUNC void __stdcall SharedStrVarSet(char *InTxt, int i)
{
switch(i)
{
case 0:
SharedStrVar1 = InTxt;
break;
case 1:
SharedStrVar2 = InTxt;
break;
}
}
MT4_EXPFUNC char* __stdcall SharedStrVarGet(int i)
{
char* out;
switch(i)
{
case 0:
out = SharedStrVar1;
break;
case 1:
out =SharedStrVar2;
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;
}
1. Запускаем программу Test.exe
2. Ещё раз запускаем Test.exe
3. Нажимаем отправить данные в общую переменную в одной копии программы.
4. Нажимаем получить данные из общих переменных в другой копии программы.
Со строковыми данными этот трюк не проходит. Либо вылетает программа, либо кракозябры получает из общих переменных.
Ниже две кнопочки для Int данных. Здесь всё работает. Почему со строками не работает?
------------ Дoбавленo в 20.01:
Прикрепил видео. Сначала демонстрируются рабочие функции. А затем, те которые не работают. Ну и сразу видно для чего нужны общие переменные внутри dll.
http://au01.ru/Video_Call_Func_Dll.rar
------------ Дoбавленo в 21.40:
Может проблема из-за того, что в функцию нужно передавать параметр типа PChar? Хотя в таком виде и отправляю данные в неё. Ничего не понимаю....
------------ Дoбавленo в 22.29:
Ещё дополнение. Вот так не работает:
#pas
begin
i:= ReadInteger(_Data,Ind);
txt:= PChar(ReadString(_Data,InTxt));
SharedStrVarSet(txt, i);
end;
#pas
begin
i:= ReadInteger(_Data,Ind);
SharedStrVarSet('Hello', i);
end;
Почему не работает, если строку читать из точки?