Как получить данные по ссылке void *

 

LPVOID WINAPI GlobalLock(HGLOBAL hMem);

по идее эта функция выделяет память и возвращает укзатель на неё. в MQL будет как int GlobalLock(int hMem);

как затем получить данные из этой памяти?

 

К сожалению, никак.

Насколько я понимаю, для каждой mql программы создается своя куча, и с объектами во внешней памяти нельзя взаимодействовать.

Тем более, что я не нашел как из int получить указатель на объект (хотя где-то должно быть - вроде разработчики говорили о такой возможности)

 
GarF1eld:

К сожалению, никак.

очень жаль... такая тема обломалась... хотя я думаю что не все потеряно и может быть ответ будет найден.

ведь если функция бы выглядела так: GlobalLock(HGLOBAL hMem, LPVOID Data);
то в этом случае Data получить я могу, объявив её как int& Data[] в MQL импорте.

И мне кажется, что если можно так, то почему же нельзя по начальному варианту?

 

На самом деле я знаю не больше вашего. Поэтому это было скорее предположение, чем утвердительный ответ.

По начальному варианту сомневаюсь, что компилятор бы позволил; а функция GlobalLock(HGLOBAL hMem, LPVOID Data); скорее всего выкинула бы исключение

 
sergeev писал(а)  :

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);

 
lea:

Эта функция не выделяет память, читайте внимательнее 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).

так подойдет? 

 
sergeev:

а как это  будет выглядеть?

в MQL void* - это int.

Это не всегда  так, в x64 это long

Советую использовать long для хранения внешних указателей для совместимости исходников x86/x64,

хотя в 32 битах вы потеряете в памяти и в скорости при использовании математики над такими указателями (ИМХО такие потери ничто, по сравнению с совместимостью).

 

ок. спасибо за совет. 

А приведенный код -как взять инфу из указателя через массив -

long Lock=GlobalLock(hMem);

GetData(long& adr[]) и передать ей параметр GetData(Lock)

а в самой функции будет что то типа string st=CharArrayToString(adr).
 

 отвечает действительности или есть другой вариант ? 

 

спасибо.