Вверх ↑
Этот топик читают: Гость
Ответов: 176
Рейтинг: 12
#1: 2011-08-26 07:58:20 ЛС | профиль | цитата
Имеется MFC dll написанная на C++. Нужно из пакета windows вызывать функцию:
#cpp
void SharedDoubleArrGet(double outArr[])
В функцию передать ссылку на одномерный массив. И нужно сделать так, чтобы можно было потом работать с этим массивом в HiAsm посредством схемы. Стандартными компонентами для работы с dll не получается.

карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 3889
Рейтинг: 362
#2: 2011-08-26 08:01:38 ЛС | профиль | цитата
CallDllEx
карма: 1

0
Ответов: 176
Рейтинг: 12
#3: 2011-08-26 08:34:29 ЛС | профиль | цитата
Делаю так. Вылетает с ран таймом
Add(MainForm,2953706,175,210)
{
Width=444
link(onCreate,16486207:doData,[])
}
Add(CallDllEx,15369058,336,336)
{
DLLName="HiAsmMQL.dll"
Point(doDLLName)
link(onFunc,11093566:doMessage,[])
}
Add(Button,8511547,210,336)
{
Left=370
Top=35
Caption="Go"
Data=Integer(0)
link(onClick,186573:doData,[])
}
Add(Message,11093566,392,336)
{
}
Add(Button,12861727,210,385)
{
Left=10
Top=10
Caption="Load dll"
link(onClick,16148391:doExecute,[])
}
Add(ODialog,16148391,273,385)
{
link(onExecute,15369058:doDLLName,[(321,391)(321,349)])
}
Add(Edit,701284,273,287)
{
Left=10
Top=35
Width=355
Text="SharedDoubleArrGet;&Arr;NULL"
}
Add(DoData,186573,273,336)
{
link(onEventData,15369058:doCallFuncStr,[])
link(Data,701284:Text,[])
}
Add(RealArray,3435453,273,175)
{
RealArray=['0'=0]
FileFormat=1
}
Add(GlobalVar,5661738,322,224)
{
Name="Arr"
}
Add(DoData,16486207,273,224)
{
link(onEventData,5661738:doValue,[])
link(Data,3435453:Array,[])
}
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 3889
Рейтинг: 362
#4: 2011-08-26 08:50:11 ЛС | профиль | цитата
toropchin, нельзя напрямую передавать текстовое имя глобальной переменной, и тип данных кодируется латинской буквой, список есть в одном из примеров. Непосредственно динамического массива чисел с плавающей запятой там, правда, нет (они всё равно по-разному реализованы в разных языках), зато есть Handle (Cardinal) и LongWord, которыми можно указать на выделенную область памяти (MemoryStream, например). Естественно, придётся работать с этими данными вручную, тут уж либо dll должна подстраиваться под тип данных программы (если компилируем её сами), либо - наоборот.
карма: 1

0
Ответов: 3349
Рейтинг: 233
#5: 2011-08-26 09:12:08 ЛС | профиль | цитата
Наши массивы другие, это классы с функция _get, _set, _count, реализации которых находятся в другом классе
------------ Дoбавленo в 09.12:
Наши массивы другие, это классы с функция _get, _set, _count, реализации которых находятся в другом классе
карма: 1

0
Ответов: 5227
Рейтинг: 587
#6: 2011-08-26 09:54:12 ЛС | профиль | цитата
Похоже тут только в рукопашную при помощи IC
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 3889
Рейтинг: 362
#7: 2011-08-26 10:05:59 ЛС | профиль | цитата
andrestudio писал(а):
только в рукопашную при помощи IC

Технически на HiAsm с твоим элементом тоже можно, и я указал примерное направление, но согласен с тем, что работа дискретными компонентами с массивом дробных чисел формата c++ как с бинарными данными - мягко говоря "не красивое" решение. На IC это делается на порядок быстрее и проще, но не все этот самый IC знают, не будем забывать
карма: 1

0
Ответов: 5227
Рейтинг: 587
#8: 2011-08-26 10:24:02 ЛС | профиль | цитата
toropchin писал(а):
В функцию передать ссылку на одномерный массив
я так понял эта функция должна что-то с этим массивом сделать
Ivann писал(а):
Наши массивы другие, это классы с функция _get, _set, _count, реализации которых находятся в другом классе
а вот по этой причине будет нестыковочка
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 176
Рейтинг: 12
#9: 2011-08-26 10:52:46 ЛС | профиль | цитата
andrestudio писал(а):
я так понял эта функция должна что-то с этим массивом сделать

Функция просто копирует входной массив в другой массив. Код этой dll:
#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")) double SharedDoubleArr[1024];
__declspec(allocate(".shared")) int SharedIntArr[1024];


MT4_EXPFUNC void __stdcall SharedDoubleArrSet(double inArr[])
{
memcpy(SharedDoubleArr, inArr, sizeof(*SharedDoubleArr)*10);
}

MT4_EXPFUNC void __stdcall SharedDoubleArrGet(double outArr[])
{
memcpy(outArr, SharedDoubleArr, sizeof(*outArr)*10);
}
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 5227
Рейтинг: 587
#10: 2011-08-26 12:05:51 ЛС | профиль | цитата
toropchin, наши массивы на TData, выход один, делать в InlineCode.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 3349
Рейтинг: 233
#11: 2011-08-26 13:02:52 ЛС | профиль | цитата
andrestudio, Неа, не один, можно использовать стримы
------------ Дoбавленo в 13.02:
andrestudio, Неа, не один, можно использовать стримы
карма: 1

0
Ответов: 5227
Рейтинг: 587
#12: 2011-08-26 14:32:29 ЛС | профиль | цитата
и это правда toropchin, если задумаешь так сделать то вызов в FormatStr будет таков code_25007.txt
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
файлы: 1code_25007.txt [725B] [225]
Гость
Ответов: 17029
Рейтинг: 0
#13: 2011-08-28 15:28:03 правка | ЛС | профиль | цитата


Редактировалось 1 раз(а), последний 2017-03-03 16:19:06
карма: 0

0
Ответов: 176
Рейтинг: 12
#14: 2011-09-02 23:10:32 ЛС | профиль | цитата
Хм. Сообщение куда-то подевалось.
В архиве 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;
------------ Дoбавленo в 23.10:
Почему не работает, если строку читать из точки?
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
файлы: 2code_25068.txt [673B] [214], call_func_dll.rar [641.4KB] [135]
Ответов: 3349
Рейтинг: 233
#15: 2011-09-03 11:35:43 ЛС | профиль | цитата
toropchin, Ты её сначала в переменную запихни
------------ Дoбавленo в 11.35:
#pas
var txt:string;
begin
i:= ReadInteger(_Data,Ind);
txt:= ReadString(_Data,InTxt) + #0;
SharedStrVarSet(@txt[1], i);
end;
карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)