IceFog, можешь объяснить, как запустить только один экземпляр библиотеки при загрузке карты, как у тебя в Example.dll, чтобы не было дизсинхронизации, только на С++. Аналог твоего запуска библиотеки на паскале:
begin
InitCamera;
InitSpell;
CreateAngryWorker;
CreateMeat;
end.
Пробывал следующий код:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call != DLL_PROCESS_ATTACH) return TRUE;
DisableThreadLibraryCalls(hModule);
if (fRegistrJassApi() == FALSE) return TRUE;
if (fRegistrNatives() == FALSE) return TRUE;
HUNIT u;
u = CreateUnit(GetLocalPlayer(),ID_UNIT_MAIN_HUMAN1,0,0,0);
IssuePointOrder(u,"move",1000,1000);
return TRUE;
}
Он запускается на обоих машинах. Как перевести с паскаля на С++ твой Example.dll?
Unryze, у меня получилось с помощью в этой статьи xgm.guru/p/wc3/anyscript (Сценарий на любом языке) поиграть по сети со своей dll'кой. Это и есть мемхак?
IceFog,
cdecl (C calling convention)
Стандартное соглашение о вызовах для программ на C/C++.
В данном соглашение аргументы передаются справа налево и кладутся на стек, как и в [[#STDCALL Standart Calling Convention|stdcall]], возвращаемое значение кладется в регистр EAX. Но вот стек уже очищается функцией, которая вызывает. Имена функций начинаются с символа нижнего подчеркивания, без указания количества байт для аргументов к конце.
stdcall (Standart Calling Convention)
STDCALL это стандартное соглашение для Win32 API. В данном соглашение, аргументы передаются справа налево и очистка стека ложится на вызываемую функцию. Для передачи аргументов используется стек, т.е. перед вызовом нужно положить аргументы на стек. Возвращаемое значение записывается в регистр eax.
КОРОЧЕ, РАЗНИЦА:
__cdecl - очистку стека производит вызывающая программа (*). Основной способ вызова для Си. Это основной способ вызова функций с переменным числом аргументов.
__stdcall (он же winapi) - очистку стека производит вызываемая подпрограмма. (**). Применяется при вызове функций WinAPI.
Даже в твоём коде файла moduleutils.pas используется stdcall:
unit ModuleUtils;
interface
const
JASS_API_DLL_NAME = 'JassApi.dll';
type
PJassString = Pointer;
TJassStringHandle = longword;
TJassFunctionHandle = longword;
TJassHandle = longword;
TSingle = record Value: Single end;
function GetJassNative(Name: PChar): Pointer; stdcall; external JASS_API_DLL_NAME;
function GetStringHandle(Value: PChar): TJassStringHandle; stdcall; external JASS_API_DLL_NAME;
function GetStringFromHandle(StringHandle: TJassStringHandle): PChar; stdcall; external JASS_API_DLL_NAME;
function GetJassString(Value: PChar): PJassString; stdcall; external JASS_API_DLL_NAME;
function GetJassStringContent(JassString: PJassString): PChar; stdcall; external JASS_API_DLL_NAME;
implementation
end.
Ev3nt,
*(BYTE*) (GameDll + 0x2de2a0+ 0x0) = 0xE8;
*(DWORD*) (GameDll + 0x2de2a0+ 0x1) = (DWORD)hookCHS - (dwGameBaseAddress + 0x2de2a0+ 0x5);
*(BYTE*) (GameDll + 0x2de2a0+ 0x5) = 0xC3;
Тут что два одинаковых адреса в разных переменных? В GameDll и в dwGameBaseAddress?
IceFog, в твоих исходниках Example\Natives.pas, есть две одинаковые константы
ITEM_TYPE_POWERUP: HITEMTYPE = 2;
ITEM_TYPE_TOME: HITEMTYPE = 2;
Это ошибка или нет?
Если посудить ITEM_TYPE один и тот же.
IceFog, Пожалуйста выложи свой JassApi,dll, а то твоя библиотека RedirectCalls.dll требует функции AddEventHandler у библиотеки JassApi.dll. Вот скриншот.
Есть у меня одна идейка, как можно реализовать поиск путей между двумя точками. Нужно создать 4 переменных стоковых (String). Занести в первую переменную уже заранее подготовленную и записанную в текстовом виде карту путей. Карта путей будет иметь разрешение 128*128 (большие клетки на карте)*4(маленькие клетки в одной большой клетке) = 65 536 маленьких клеток на карте путей. 1 маленькая клетка 1 символ в стоке. Символ "1" или "0". Можно пройти в этой клетке или нет. 1 - можно, 0 - нет. 1 стока будет отвечать за рельеф на игровой карте. 2 стока будет отвечать за разрушаемые объекты деревья на игровой карте. 3 стока будет отвечать за расположения любых юнитов на игровой карте. 4 стока необходима для расчёта оптимального пути между клетками. С начало в 4 стоку заносятся все данные из первых 3 сток. А потом уже идёт аналитический процесс для определения оптимального пути между клетками на карте путей, по тем или иным условиями. Например наш юнит занимает на карте путей 2*2 маленькие клетки. И нужно будет определить оптимальный путь на карте путей именно для этого юнита, у которого такой размер на карте путей. Это мы будем делать следующим образом. Проверять сразу 2 соседнии клетки с любой стороны, а именно сверху, снизу, слева и справа. И условие будет такое, если хоть одна маленькая клетка свободная, то меняем числовое значение удаленности от первой точки на карте в переменной, а если 2 клетки заняты, то не меняем никакие числовые значения в переменной. А если мы не доберемся до этой клетки на карте и все остальные клетки на карте уже заняты, то пройти в эту точку нельзя.
Да, кстати, забыл добавить, что придётся создавать массив из 65 536 числовых элементов. Это можно реализовать следующим образом. Создать несколько однотипных массивов по 8192 числовых элементов. Данный огромный массив будет состоять из 8 таких массивов. В который мы с помощью отдельных функций и будем записывать и забирать наши числовые значения. А именно числовые значения удалённости от первой точки на карте. До следующей точки на карте.
Нет не баф. Мне надо применить заклинание "Целительная волна", через какую-нибудь другую способность, аналогичную способности канал. Так как в списке заклинаний у способности канал нету этого заклинания.
» WarCraft 3 / Работа с нативными функциями
» WarCraft 3 / Сценарий на любом языке
» WarCraft 3 / Сценарий на любом языке
» WarCraft 3 / Сценарий на любом языке
» WarCraft 3 / Сценарий на любом языке
» WarCraft 3 / Работа с нативными функциями
» WarCraft 3 / Работа с нативными функциями
» WarCraft 3 / Работа с нативными функциями
» WarCraft 3 / Открытая виртуальная машина
» WarCraft 3 / Своя нативка на С++
» WarCraft 3 / Своя нативка на С++
» WarCraft 3 / Своя нативка на С++
Ред. Vampir_kolik
» WarCraft 3 / Своя нативка на С++
cdecl (C calling convention)
Стандартное соглашение о вызовах для программ на C/C++.
STDCALL это стандартное соглашение для Win32 API. В данном соглашение, аргументы передаются справа налево и очистка стека ложится на вызываемую функцию. Для передачи аргументов используется стек, т.е. перед вызовом нужно положить аргументы на стек. Возвращаемое значение записывается в регистр eax.
__cdecl - очистку стека производит вызывающая программа (*). Основной способ вызова для Си. Это основной способ вызова функций с переменным числом аргументов.
__stdcall (он же winapi) - очистку стека производит вызываемая подпрограмма. (**). Применяется при вызове функций WinAPI.
» WarCraft 3 / Вызов функций вк 3, через mix (dll)
*(BYTE*) (GameDll + 0x2de2a0+ 0x0) = 0xE8;
*(DWORD*) (GameDll + 0x2de2a0+ 0x1) = (DWORD)hookCHS - (dwGameBaseAddress + 0x2de2a0+ 0x5);
*(BYTE*) (GameDll + 0x2de2a0+ 0x5) = 0xC3;
Тут что два одинаковых адреса в разных переменных? В GameDll и в dwGameBaseAddress?
» WarCraft 3 / Вызов функций вк 3, через mix (dll)
» WarCraft 3 / Сценарий на любом языке
ITEM_TYPE_POWERUP: HITEMTYPE = 2;
ITEM_TYPE_TOME: HITEMTYPE = 2;
Это ошибка или нет?
Если посудить ITEM_TYPE один и тот же.
Ред. Vampir_kolik
» WarCraft 3 / Работа с нативными функциями
» WarCraft 3 / Пути
Ред. Vampir_kolik
» WarCraft 3 / Пути
Да, кстати, забыл добавить, что придётся создавать массив из 65 536 числовых элементов. Это можно реализовать следующим образом. Создать несколько однотипных массивов по 8192 числовых элементов. Данный огромный массив будет состоять из 8 таких массивов. В который мы с помощью отдельных функций и будем записывать и забирать наши числовые значения. А именно числовые значения удалённости от первой точки на карте. До следующей точки на карте.
» WarCraft 3 / Пути
Ред. Vampir_kolik
» WarCraft 3 / Пути
» WarCraft 3 / Аналог способности канал
Ред. Vampir_kolik
» WarCraft 3 / Как отключить героям в AI скрипте автоприменение способностей
Ред. Vampir_kolik
» WarCraft 3 / Аналог способности канал
Ред. Vampir_kolik
» WarCraft 3 / Аналог способности канал