К сожалению, никак.
Насколько я понимаю, для каждой mql программы создается своя куча, и с объектами во внешней памяти нельзя взаимодействовать.
Тем более, что я не нашел как из int получить указатель на объект (хотя где-то должно быть - вроде разработчики говорили о такой возможности)
К сожалению, никак.
очень жаль... такая тема обломалась... хотя я думаю что не все потеряно и может быть ответ будет найден.
ведь если функция бы выглядела так: GlobalLock(HGLOBAL hMem, LPVOID Data);
то в этом случае Data получить я могу, объявив её как int& Data[] в MQL импорте.
И мне кажется, что если можно так, то почему же нельзя по начальному варианту?
На самом деле я знаю не больше вашего. Поэтому это было скорее предположение, чем утвердительный ответ.
По начальному варианту сомневаюсь, что компилятор бы позволил; а функция GlobalLock(HGLOBAL hMem, LPVOID Data); скорее всего выкинула бы исключение
LPVOID WINAPI GlobalLock(HGLOBAL hMem);
по идее эта функция выделяет память и возвращает укзатель на неё. в MQL будет как int GlobalLock(int hMem);
как затем получить данные из этой памяти?
Эта функция не выделяет память, читайте внимательнее msdn: Locks a global memory object and returns a pointer to the first byte of the object's memory block.
О необходимости применения GlobalLock написано в описании флагов к GlobalAlloc.
Получить данные можно только копированием внутри Вашей dll
void GetData(int hMem,int &data[],int size);
Эта функция не выделяет память, читайте внимательнее msdn: Locks a global memory object and returns a pointer to the first byte of the object's memory block.
О необходимости применения GlobalLock написано в описании флагов к GlobalAlloc.
Куда применять глобал - мне требуется работать с Clipboard
пример брал из MSDN.
if (OpenClipboard(hwnd))
{
hglb=GetClipboardData(CF_TEXT);
clip=GlobalLock(hglb);
GlobalUnlock(hglb);
CloseClipboard();
}
Вобщем подскажите как из этого clip вытащить полученную строку
BOOL WINAPI OpenClipboard(HWND);
HANDLE WINAPI GetClipboardData(UINT);
BOOL WINAPI CloseClipboard(void);
LPVOID WINAPI GlobalLock(HGLOBAL hMem);
BOOL WINAPI GlobalUnlock(HGLOBAL hMem);
сделать ссылку на массив по моему самое простое
сам по себе воид ничего не возврашает
но указав ссылку на массив воид прицепиться к нему и будет с ним опрерировать
это описано в статье про субд
а как это будет выглядеть?
в MQL void* - это int.
то есть функция записывается в виде
int GlobalLock(int hMem);
память локируется, адрес получается.
int Lock=GlobalLock(hMem);
но что дальше с этим адресом из Lock делать .... не могу придумать. как вытащить из него данные
может что то типа вызвать функцию
GetData(int& adr[]) и передать ей параметр GetData(Lock)
а в самой функции будет string st=CharArrayToString(adr).
так подойдет?
а как это будет выглядеть?
в MQL void* - это int.
Это не всегда так, в x64 это long
Советую использовать long для хранения внешних указателей для совместимости исходников x86/x64,
хотя в 32 битах вы потеряете в памяти и в скорости при использовании математики над такими указателями (ИМХО такие потери ничто, по сравнению с совместимостью).
ок. спасибо за совет.
А приведенный код -как взять инфу из указателя через массив -
long Lock=GlobalLock(hMem);
GetData(long& adr[]) и передать ей параметр GetData(Lock)
а в самой функции будет что то типа string st=CharArrayToString(adr).
отвечает действительности или есть другой вариант ?
спасибо.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
LPVOID WINAPI GlobalLock(HGLOBAL hMem);
по идее эта функция выделяет память и возвращает укзатель на неё. в MQL будет как int GlobalLock(int hMem);
как затем получить данные из этой памяти?