powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как узнать какие перегрузки есть у dll ?
44 сообщений из 44, показаны все 2 страниц
Как узнать какие перегрузки есть у dll ?
    #39663815
hoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hoz
Гость
Нашёл проект, который есс-но обращается к стандартным dll винды. Есс-но написано на C++. Вот вопрос, как узнать какие у kernel32.dll есть функции?
Есть вот функция RtlMoveMemory . У RtlMoveMemory как видно там 1 перегрузка. А в коде, который я нашёл импортируется из kernel32.dll много перегрузок функции RtlMoveMemory :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void RtlMoveMemory(intptr_t dest,const uchar &array[],size_t length);
void RtlMoveMemory(uchar &array[],intptr_t src,size_t length);
void RtlMoveMemory(intptr_t dest,const MqlRates &array[],size_t length);
void RtlMoveMemory(MqlRates &array[],intptr_t src,size_t length);
void RtlMoveMemory(intptr_t dest,const MqlTick &value,size_t length);
void RtlMoveMemory(MqlTick &value,intptr_t src,size_t length);
void RtlMoveMemory(intptr_t &dest,intptr_t src,size_t length);


Отсюда возникает вопрос. Где вообще можно было увидеть, что такие перегрузки в этой библиотеке имеются? Ведь описания нигде нет. По крайне мере, я не нашёл.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663816
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RemarksThis function is defined as the RtlMoveMemory function.
Its implementation is provided inline.
For more information, see WinBase.h and Winnt.h.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663817
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Winnt.h я нашел только

#if defined(_M_IX86) || defined(_M_MRX000) || defined(_M_ALPHA)
#define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))
#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
#else

NTSYSAPI
VOID
NTAPI
RtlCopyMemory (
VOID UNALIGNED *Destination,
CONST VOID UNALIGNED *Source,
DWORD Length
);

NTSYSAPI
VOID
NTAPI
RtlMoveMemory (
VOID UNALIGNED *Destination,
CONST VOID UNALIGNED *Source,
DWORD Length
);

NTSYSAPI
VOID
NTAPI
RtlFillMemory (
VOID UNALIGNED *Destination,
DWORD Length,
BYTE Fill
);

NTSYSAPI
VOID
NTAPI
RtlZeroMemory (
VOID UNALIGNED *Destination,
DWORD Length
);
#endif


И?
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663819
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что "и"?
R(un-)T(ime)L(ibrary) означает, что туда не надо лезть грязными лапками.
Есть заголовки и компилятор, который с этими заголовками работает - вот он и сделает всю магию, возможно, встроив некоторые вызовы в ваш код.

P.S.
Может, имеет смысл озвучить постановку задачи, вместо вашего понимания "правильного решения"?
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663821
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hoz,

Win32 API написано на С, а в нем нет перегрузок
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663826
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... но никто не запрещает записать в экспорты имена, "искажённые" по известным правилам.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663827
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov... но никто не запрещает записать в экспорты имена, "искажённые" по известным правилам.А может, в школу ?
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663832
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglА может, в школу ?Вы конкретно за Win32 API или за принципиальную возможность?
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663835
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovSiemarglА может, в школу ?Вы конкретно за Win32 API или за принципиальную возможность?конкретно, особенно конкретно за kernel32.dll

а так есть dll export viewers в массовом варианте
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663836
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglа так есть dll export viewers в массовом варианте
Только нет смысла смотреть в Dependency Walker'е, потому что сишные функции однозначно идентифицируются по именам,
так как не могут быть перегружены, и списка аргументов там всё равно не увидеть.
В таких случаях перегрузки эмулируются макросами, и имена у функций будут совсем разными.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663838
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZSiemarglа так есть dll export viewers в массовом варианте
Только нет смысла смотреть в Dependency Walker'е, потому что сишные функции однозначно идентифицируются по именам,
так как не могут быть перегружены, и списка аргументов там всё равно не увидеть.
В таких случаях перегрузки эмулируются макросами, и имена у функций будут совсем разными.
ой, всё

плюсовые ф-ции декорируются по именам экспорта. там много чего кодируется в декорировании. и не забываем про ООП
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663842
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglплюсовые ф-ции декорируются по именам экспорта. там много чего кодируется в декорировании. и не забываем про ООП
Это называется name mangling'ом. В сообществе обсуждается стандартизация ABI на всех платформах/компиляторах, что, конечно же
наконец-то позволит избавиться от ещё одного бича C++.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663854
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZВ сообществе обсуждается стандартизация ABI на всех платформах/компиляторах

Ась? Они будут убеждать MS перейти на ELF формат или наоборот?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663867
hoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hoz
Гость
Basil A. Sidorov,
Благодарю. Я только что обратил внимание на это:
авторThis function is defined as the RtlMoveMemory function. Its implementation is provided inline. For more information, see WinBase.h and Winnt.h.
Its implementation is provided inline означает, что реализация этой функции обеспечивается встраиванием? Как0то не читабельно.. ((
Только вот не понятно, а где эти инклюдники вообще брать? Я о WinBase.h and Winnt.h
Я на Java больше программирую. А на С++ мало и не на том уровне. Поиск ничего не дал толком. Я вообще не понял, как можно было догадаться до того, что бы подобное, что я изначально написал использовать. В различных вариациях использовать вызов RtlMoveMemory .
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663868
hoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hoz
Гость
Basil A. Sidorov,

Цель проста. Я хочу привязать SQLite к языку, который примитивный, конечно, по сравннию в Java, C++, C# и тд, но популярный. Так вот нужно прилепить базу данных к боту, которого я пишу. я нашёл написанную реализацию, которую написал, как я понял китаец. Вот его репозиторий .
А вот здесь интересующий меня момент:
Код: plaintext
1.
2.
oid RtlMoveMemory(intptr_t dest,const uchar &array[],size_t length);
void RtlMoveMemory(uchar &array[],intptr_t src,size_t length);


Вот хочу понять, как он пришёл к такому выводу вообще. Если я обычно для реализации задачи в Java пользуюсь фреймворком или стандартными JDK, то тут не понятно откуда он черпанул инфу и влепил 2 варианта функции RtlMoveMemory, которые я не нашёл нигде. Вот мне очень хочется понять этот момент. Поэтому и написал сюда т.к. вижу, что здесь опытные программисты есть.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663878
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hozТолько вот не понятно, а где эти инклюдники вообще брать? Я о WinBase.h and Winnt.h Надо скачать Windows SDK, оно свободное, оно обычно обязательно при разработке. Возможно, оно уже стоит. В Program files или в Program files (x86) есть папка Windows SDKs/Windows/v7.1/Include там эти файлы лежат. Ну или где-то рябом.
Если SDK на машине не стоит, а стоит студия, и всё собирается - в папке со студией есть папка VC/Include - там поискать.

hozОтсюда возникает вопрос. Где вообще можно было увидеть, что такие перегрузки в этой библиотеке имеются? Ведь описания нигде нет. По крайне мере, я не нашёл.
В общем случае, как я понимаю, если нет h-файла, узнать кроме имени из таблицы импорта нельзя ничего. Дело в том, что при вызове функций код просто складывает в стек все параметры. А код функции как-то там их вытаскивает из стека и использует. Тип и порядок передаваемых параметров отслеживается компилятором при генерации кода вызывающей программы. И это как раз опирается на то, что написано в h-файле. Т.е. без h-файла узнать сигнатуру функции нельзя (только если глядя в ассемблерный код dll-ки). Если я не прав, расскажите мне, как это сделать, я буду рад :)
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663890
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovАсь? Они будут убеждать MS перейти на ELF формат или наоборот?

ЕМНИП Имеются в виду единые правила манглинга имён + будущая совместимость типов std от разных компиляторов.
Теперь выставление C++ интерфейсов с типами std::abi не будет чем-то позорным.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663896
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hozНашёл проект, который есс-но обращается к стандартным dll винды. Есс-но написано на C++. Вот вопрос, как узнать какие у kernel32.dll есть функции?


Прочитать документацию.

hozЕсть вот функция RtlMoveMemory . У RtlMoveMemory как видно там 1 перегрузка. А в коде, который я нашёл импортируется из kernel32.dll много перегрузок функции RtlMoveMemory :


Windows как и многие OS написан на чистом С, в нем нет перегрузок функций.
Кроме этого, API OS пишется для разных языков программирования, и в том числе для тех,
где не используются перегрузки, поэтому их обычно пишут на чистом С, даже если сама OS
может быть написана на С++. Поэтому, опять, там нет и не может быть перегрузок.

hoz
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void RtlMoveMemory(intptr_t dest,const uchar &array[],size_t length);
void RtlMoveMemory(uchar &array[],intptr_t src,size_t length);
void RtlMoveMemory(intptr_t dest,const MqlRates &array[],size_t length);
void RtlMoveMemory(MqlRates &array[],intptr_t src,size_t length);
void RtlMoveMemory(intptr_t dest,const MqlTick &value,size_t length);
void RtlMoveMemory(MqlTick &value,intptr_t src,size_t length);
void RtlMoveMemory(intptr_t &dest,intptr_t src,size_t length);




А откуда ты взял эти сигнатуры?
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663897
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZDimitry SibiryakovАсь? Они будут убеждать MS перейти на ELF формат или наоборот?

ЕМНИП Имеются в виду единые правила манглинга имён + будущая совместимость типов std от разных компиляторов.
Теперь выставление C++ интерфейсов с типами std::abi не будет чем-то позорным.

Манглинг применяесят для функций С++.
Функции Windows -- чистые С функции, манглинг там не применяется.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663898
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbhozТолько вот не понятно, а где эти инклюдники вообще брать? Я о WinBase.h and Winnt.h Надо скачать Windows SDK, оно свободное, оно обычно обязательно при разработке. Возможно, оно уже стоит. В Program files или в Program files (x86) есть папка Windows SDKs/Windows/v7.1/Include там эти файлы лежат. Ну или где-то рябом.
Если SDK на машине не стоит, а стоит студия, и всё собирается - в папке со студией есть папка VC/Include - там поискать.

hozОтсюда возникает вопрос. Где вообще можно было увидеть, что такие перегрузки в этой библиотеке имеются? Ведь описания нигде нет. По крайне мере, я не нашёл.
В общем случае, как я понимаю, если нет h-файла, узнать кроме имени из таблицы импорта нельзя ничего. Дело в том, что при вызове функций код просто складывает в стек все параметры. А код функции как-то там их вытаскивает из стека и использует. Тип и порядок передаваемых параметров отслеживается компилятором при генерации кода вызывающей программы. И это как раз опирается на то, что написано в h-файле. Т.е. без h-файла узнать сигнатуру функции нельзя (только если глядя в ассемблерный код dll-ки). Если я не прав, расскажите мне, как это сделать, я буду рад :)

Вот всё правильно!
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663899
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hozЕсть вот функция RtlMoveMemory .


Если ты не заметил маленький нюанс, хочу обратить на него внимание.
Ты говоришь про функцию RtlMoveMemory , а ссылаешься на документацию по функции MoveMemory .
Ты не заметил небольшую разницу в их названии?
Это разные функции.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663938
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivМанглинг применяесят для функций С++.
Функции Windows -- чистые С функции, манглинг там не применяется.
Это уже 100 раз сказали выше.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39663941
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hozА вот здесь интересующий меня момент:
Код: plaintext
1.
2.
oid RtlMoveMemory(intptr_t dest,const uchar &array[],size_t length);
void RtlMoveMemory(uchar &array[],intptr_t src,size_t length);

Вот хочу понять, как он пришёл к такому выводу вообще.Насколько я понимаю, это фишка конкретно mql - один и тот же экспорт импортирован с двумя разными сигнатурами для удобства использования.
Вы трейдер - вам и разбираться, но к плюсам никак не относится.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664029
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таблице экспорта присутствует лишь одна функция RtlMoveMemory и именно она используется для всех этих перегрузок с разными типами. Если внимательно приглядеться, к перегрузкам, то можно заметить, что они представляют из себя перегрузки с разными типами одной и той же функции, которая перемещает количество байт (length):
Код: plaintext
1.
void RtlMoveMemory(char *dest, char const *src, size_t length);

Иными словами, все эти перегрузки сделаны для удобства написания и восприятия кода. Ничто не мешает сделать свою собственную перегрузку - со своими типами, чтобы не загромождать свой код приведением типов при вызове RtlMoveMemory.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664214
hoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hoz
Гость
MasterZivА откуда ты взял эти сигнатуры?
Так вот же
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664227
hoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hoz
Гость
MasterZivЕсли ты не заметил маленький нюанс, хочу обратить на него внимание.
Ты говоришь про функцию RtlMoveMemory , а ссылаешься на документацию по функции MoveMemory .
Ты не заметил небольшую разницу в их названии?
Это разные функции.
Конечно, заметил. Но ведь написано же:
авторThis function is defined as the RtlMoveMemory function.
А это значит, что:
авторЭта функция т.е. MoveMemory определена как функция RtlMoveMemory
Я так понимаю, они одинаковые. По сигнатуре и по параметра есс-но, т.к. перегрузок, как выше сказали нет. Я уже понял почему.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664362
hoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hoz
Гость
Basil A. SidorovhozА вот здесь интересующий меня момент:
Код: plaintext
1.
2.
oid RtlMoveMemory(intptr_t dest,const uchar &array[],size_t length);
void RtlMoveMemory(uchar &array[],intptr_t src,size_t length);

Вот хочу понять, как он пришёл к такому выводу вообще.Насколько я понимаю, это фишка конкретно mql - один и тот же экспорт импортирован с двумя разными сигнатурами для удобства использования.
Вы трейдер - вам и разбираться, но к плюсам никак не относится.
Очень, навряд ли. В мкл вообще ничего своего толком нет, кроме кастомных функций. Я документацию уже перелопатил ни один раз. Слишком всё примитивно там. Тем более, использование это одно, а здесь мы имеем дело с явным вызовом что-ли с разными аргументами. Я вот это сам не понял, до сих пор.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664369
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hozЯ вот это сам не понял, до сих пор.

Ну и забей. Используй стандартные memcpy() или mommove(). Они и портабельны и работают
быстрее при некоторой удаче.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664370
hoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hoz
Гость
rdb_devВ таблице экспорта присутствует лишь одна функция RtlMoveMemory и именно она используется для всех этих перегрузок с разными типами. Если внимательно приглядеться, к перегрузкам, то можно заметить, что они представляют из себя перегрузки с разными типами одной и той же функции, которая перемещает количество байт (length):
Код: plaintext
1.
void RtlMoveMemory(char *dest, char const *src, size_t length);

Иными словами, все эти перегрузки сделаны для удобства написания и восприятия кода. Ничто не мешает сделать свою собственную перегрузку - со своими типами, чтобы не загромождать свой код приведением типов при вызове RtlMoveMemory.
Хм. Да, вижу. Но делать перегрузки самому, когда перегрузка является лишь поводом для перестановки аргументов странно. Как-то по мне, это не имеет ни смысла, ни удобства. Ведь Аргументы те же самые. У меня подобное бывает, но это когда есть в конце умолчательные значения, а не так..
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664386
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hozздесь мы имеем дело с явным вызовом что-ли с разными аргументамиЕсть экспортируемая функция со вполне конкретной сигнатурой.
Есть импорт этой функции для использования в другом языке (не C/C++) в этом "другом языке" есть возможность объявить разные сигнатуры для единственного экспорта. Естественно, при условии, что эти сигнатуры фактически эквивалентны .
Если внимательно посмотреть, объявленные импорты - эквивалентны.
Зачем сделано так - это уже вопрос к использованию функции в MQL. К C/C++, повторю, это всё никак не относится.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664401
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hozХм. Да, вижу. Но делать перегрузки самому, когда перегрузка является лишь поводом для перестановки аргументов странно. Как-то по мне, это не имеет ни смысла, ни удобства. Ведь Аргументы те же самые. У меня подобное бывает, но это когда есть в конце умолчательные значения, а не так..Так в mql нет ни нормальных указателей, ни операции получения адреса. Вот и используются перезагрузки для каждого используемого типа. Вы же никак не получите адрес массива в виде числа.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664407
hoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hoz
Гость
Basil A. Sidorovhozздесь мы имеем дело с явным вызовом что-ли с разными аргументамиЕсть экспортируемая функция со вполне конкретной сигнатурой.
Есть импорт этой функции для использования в другом языке (не C/C++) в этом "другом языке" есть возможность объявить разные сигнатуры для единственного экспорта. Естественно, при условии, что эти сигнатуры фактически эквивалентны .
Если внимательно посмотреть, объявленные импорты - эквивалентны.
Зачем сделано так - это уже вопрос к использованию функции в MQL. К C/C++, повторю, это всё никак не относится.
По сути, да. Я согласен. Один вопрос по этой теме остался. Как вы вообще ориентируетесь в таких моментах? Вот есть по функции RtlMoveMemory документация. Мы видим:
Код: plaintext
1.
2.
3.
4.
5.
VOID RtlMoveMemory(
  _Out_       VOID UNALIGNED *Destination,
  _In_  const VOID UNALIGNED *Source,
  _In_        SIZE_T         Length
);


Как я понял, _Out_ это параметр, посредством который будет возвращаться значение в результате отработки функции, а _In_ - параметр, для принятия аргументов. Тут понятно, если я прав.
UNALIGNED как я понял из того, что прочитал нужен для передачи указателя, что бы компилятор предположит, что мол указатель будет not aligned . Хотя не понятно, зачем.
С типом SIZE_T всё понятно. А вот первые 2 параметра имеют тип VOID. Какм боком того узнать, какой тип передавать?
Ведь в приведённом мной примере:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void RtlMoveMemory(intptr_t dest,const uchar &array[],size_t length);
void RtlMoveMemory(uchar &array[],intptr_t src,size_t length);
void RtlMoveMemory(intptr_t dest,const MqlRates &array[],size_t length);
void RtlMoveMemory(MqlRates &array[],intptr_t src,size_t length);
void RtlMoveMemory(intptr_t dest,const MqlTick &value,size_t length);
void RtlMoveMemory(MqlTick &value,intptr_t src,size_t length);
void RtlMoveMemory(intptr_t &dest,intptr_t src,size_t length);


Типы передаются, кроме известного SIZE_T ещё и long и меньше по размеру.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664409
hoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hoz
Гость
BarlonehozХм. Да, вижу. Но делать перегрузки самому, когда перегрузка является лишь поводом для перестановки аргументов странно. Как-то по мне, это не имеет ни смысла, ни удобства. Ведь Аргументы те же самые. У меня подобное бывает, но это когда есть в конце умолчательные значения, а не так..Так в mql нет ни нормальных указателей, ни операции получения адреса. Вот и используются перезагрузки для каждого используемого типа. Вы же никак не получите адрес массива в виде числа.
Это да. К тому же все типы не являются наследниками объектов. А это тоже касяк. В Java можно передавать что угодно, потом привести к типу и всё стабильно. А в мкл не вариант. Много касяков, но.. мне нужно проверить некоторые вещи. Сразу перепрыгнуть куда-то ещё сложно.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664420
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hozКак вы вообще ориентируетесь в таких моментах?Я не ориентируюсь.
В данном конкретном случае я воспользовался "презумпцией правильности": раз код (предположительно) рабочий, то (какой-то) смысл в нём есть.
Тогда я обратил внимание, что, фактически, все эти сигнатуры эквивалентны "два указателя и число".
В качестве первого приближения меня это устроило - я не планирую разбираться в деталях MQL.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664427
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hozКак я понял, _Out_ это параметр, посредством который будет возвращаться значение в результате отработки функции, а _In_ - параметр, для принятия аргументов. Тут понятно, если я прав.
UNALIGNED как я понял из того, что прочитал нужен для передачи указателя, что бы компилятор предположит, что мол указатель будет not aligned . Хотя не понятно, зачем.
С типом SIZE_T всё понятно. А вот первые 2 параметра имеют тип VOID. Какм боком того узнать, какой тип передавать?
Ведь в приведённом мной примере:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void RtlMoveMemory(intptr_t dest,const uchar &array[],size_t length);
void RtlMoveMemory(uchar &array[],intptr_t src,size_t length);
void RtlMoveMemory(intptr_t dest,const MqlRates &array[],size_t length);
void RtlMoveMemory(MqlRates &array[],intptr_t src,size_t length);
void RtlMoveMemory(intptr_t dest,const MqlTick &value,size_t length);
void RtlMoveMemory(MqlTick &value,intptr_t src,size_t length);
void RtlMoveMemory(intptr_t &dest,intptr_t src,size_t length);


Типы передаются, кроме известного SIZE_T ещё и long и меньше по размеру.Что значит "какой тип передавать"? У MoveMemory первые два параметра - указатели. Адреса то есть. И копирует она lenth байтов из памяти по второму адресу в память по первому адресу. Что вам надо скопировать, адрес того и нужно передавать. Ссылка на переменную - это как раз адрес. Меня вот больше интересует, откуда там адреса в виде целых значений появляются. Видимо, из какой-то другой api функции, которая указатель возвращает. Костыли.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664429
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneЧто значит "какой тип передавать"?

Он не в курсе что такое "указатели".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664447
hoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hoz
Гость
Dimitry SibiryakovBarloneЧто значит "какой тип передавать"?

Он не в курсе что такое "указатели".

Конечно, знаю. Их можно разыменовать. Но в мкл нет указателей нормальны. Они там называются так, но, в отличие от С++, они являются так как они называют дексрипторами. А это ограниченная хрень. Я бы назвал недоуказатели.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664448
hoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hoz
Гость
BarlonehozКак я понял, _Out_ это параметр, посредством который будет возвращаться значение в результате отработки функции, а _In_ - параметр, для принятия аргументов. Тут понятно, если я прав.
UNALIGNED как я понял из того, что прочитал нужен для передачи указателя, что бы компилятор предположит, что мол указатель будет not aligned . Хотя не понятно, зачем.
С типом SIZE_T всё понятно. А вот первые 2 параметра имеют тип VOID. Какм боком того узнать, какой тип передавать?
Ведь в приведённом мной примере:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void RtlMoveMemory(intptr_t dest,const uchar &array[],size_t length);
void RtlMoveMemory(uchar &array[],intptr_t src,size_t length);
void RtlMoveMemory(intptr_t dest,const MqlRates &array[],size_t length);
void RtlMoveMemory(MqlRates &array[],intptr_t src,size_t length);
void RtlMoveMemory(intptr_t dest,const MqlTick &value,size_t length);
void RtlMoveMemory(MqlTick &value,intptr_t src,size_t length);
void RtlMoveMemory(intptr_t &dest,intptr_t src,size_t length);


Типы передаются, кроме известного SIZE_T ещё и long и меньше по размеру.Что значит "какой тип передавать"? У MoveMemory первые два параметра - указатели. Адреса то есть. И копирует она lenth байтов из памяти по второму адресу в память по первому адресу. Что вам надо скопировать, адрес того и нужно передавать. Ссылка на переменную - это как раз адрес. Меня вот больше интересует, откуда там адреса в виде целых значений появляются. Видимо, из какой-то другой api функции, которая указатель возвращает. Костыли.
Всё там есть. В другой библиотеке, например, я увидел, где он берёт указатель:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#import "kernel32.dll"
  void RtlMoveMemory(intptr_t dest, const uchar &array[], size_t length);
  void RtlMoveMemory(uchar &array[], intptr_t src, size_t length);
#import
//==================================================================================================================================================================================
// Copy the memory contents pointed by src to array. Array parameter should be initialized to the desired size. ====================================================================
void ArrayFromPointer(uchar &array[], intptr_t src, int count = WHOLE_ARRAY) {
  int size = (count == WHOLE_ARRAY) ? ArraySize(array) : count;
  RtlMoveMemory(array, src, (size_t)size);
}
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664449
hoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hoz
Гость
Дальше вот вызов функции и ArrayFromPointer и присвоение указателя:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void getColumn(int i, uchar &blob[]) const {
   int len = sqlite3_column_bytes(m_ref, i);
   if (len == 0) {
     ArrayFree(blob);
     return;
   }
   intptr_t blobp = sqlite3_column_blob(m_ref, i);
   ArrayResize(blob, len);
   ArrayFromPointer(blob, blobp, len);
   }
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664519
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hoz,

что ты в конце концов хочешь узнать?

в компутере нет понятия типов, есть только адреса данных. и все эти обертки - они просто это демонстрируют (от слова демон - демонстратор измерений, упс). и все операции копирования с придуманными в mql типами == memcpy == RtlMoveMemory
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664526
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZMasterZivМанглинг применяесят для функций С++.
Функции Windows -- чистые С функции, манглинг там не применяется.
Это уже 100 раз сказали выше.

А толк был?
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39664564
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hozДальше вот вызов функции и ArrayFromPointer и присвоение указателя:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void getColumn(int i, uchar &blob[]) const {
   int len = sqlite3_column_bytes(m_ref, i);
   if (len == 0) {
     ArrayFree(blob);
     return;
   }
   intptr_t blobp = sqlite3_column_blob(m_ref, i);
   ArrayResize(blob, len);
   ArrayFromPointer(blob, blobp, len);
   }

Ага, ну вот, sqlite3_column_blob возвращает указатель на данные. В C++ можно было бы работать с данными непосредственно в этом буфере. А в mql приходится их сначала копировать.
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39665072
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hozХм. Да, вижу. Но делать перегрузки самому, когда перегрузка является лишь поводом для перестановки аргументов странно. Как-то по мне, это не имеет ни смысла, ни удобства. Ведь Аргументы те же самые.Почему же не имеет ни смысла, ни удобства? Имеет!... Хотя бы для того, чтобы не расписывать длинные приведения типа, подобно этим:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
template <class T>
__INLINE
void MoveMemoryOf(T& dst, const T& src)
{
  std::memmove(
      reinterpret_cast<char*>(&dst),
      reinterpret_cast<const char*>(&src),
      sizeof(T));
}
...
Рейтинг: 0 / 0
Как узнать какие перегрузки есть у dll ?
    #39665111
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон муа! Как обычно - не проверил.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <mem.h>
template <class T>
__INLINE
void MoveMemoryOf(T& dst, const T& src)
{
  memmove(
      reinterpret_cast<void*>(&dst),
      reinterpret_cast<const void*>(&src),
      sizeof(T));
}
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как узнать какие перегрузки есть у dll ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]