Вверх ↑
Этот топик читают: Гость
Ответов: 872
Рейтинг: 101
#1: 2020-10-20 23:33:57 ЛС | профиль | цитата
Не очень понимаю в чем дело но вот дело не работает

иметься UnityPlayer.dll с одной единственной функцией UnityMain которой вроде всё равно кто и как её вызывает, всегда работает.

код на си

HMODULE hDll = LoadLibrary("UnityPlayer.dll");
pFunc UnityMain = (pFunc)GetProcAddress(hDll, "UnityMain");
UnityMain();
FreeLibrary(hDll);

но вот fpc64 выдает кракозябры и floating point overflow
InlineCode для хиасма

unit HiAsmUnit;
interface

uses kol,Share,Debug,windows;

type

THiAsmClass = class(TDebug)
private

public

procedure doLoad(var dt: TData; idx: word);

end;

implementation

procedure THiAsmClass.doLoad;
var
fUnityMain : procedure; cdecl;
LibHandle : THandle;

begin
LibHandle := LoadLibrary(PAnsiChar('UnityPlayer.dll'));

if LibHandle ‹› 0 then
begin
fUnityMain := GetProcAddress(LibHandle, 'UnityMain');
if @fUnityMain ‹› nil then
fUnityMain;
end;
fUnityMain := nil;
FreeLibrary(LibHandle);
end;
end.

по ссылке архив со всем необходимым, (если у вас есть игра на Unity и нужная DLL то архив не нужен)
https://yadi.sk/d/kGlNvPC-0_JEOw

Редактировалось 1 раз(а), последний 2020-10-20 23:35:15
карма: 1

0
vip
#1.1контекстная реклама от партнеров
Ответов: 4621
Рейтинг: 746
#2: 2020-10-21 10:30:37 ЛС | профиль | цитата
typedef void(__stdcall *pFunc)();

pFunc предполагается 'stdcall', а у тебя fUnityMain = 'cdecl'.
карма: 26

0
Ответов: 872
Рейтинг: 101
#3: 2020-10-21 12:03:14 ЛС | профиль | цитата
ставил stdcall результат тот же, поковырявшись с дебагом, выяснил что инициализация DLL проходит успешно, но дальше где то в дебрях DLL-ки вываливается exception, есть предположение что это связано с HeapCreate, HeapAlloc, очевидно я что то не так делаю.. даже в лазарусе падает.

ZLhgMWGsGM.png

Редактировалось 2 раз(а), последний 2020-10-21 23:37:14
карма: 1

0
Ответов: 872
Рейтинг: 101
#4: 2020-12-06 00:57:41 ЛС | профиль | цитата
понял в чем была проблема

Add(MainForm,10005516,182,126)
{
Width=365
Height=222
link(onCreate,9213313:doStart,[])
}
Add(InlineCode,14221949,336,140)
{
WorkPoints=#6:doLoad|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Debug,windows;|0:|4:type|0:|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|3: |46: procedure doLoad(var dt: TData; idx: word);|0:|5: end;|0:|14:implementation|0:|30: procedure THiAsmClass.doLoad;|4: var|33: fUnityMain : procedure; cdecl;|23: LibHandle : THandle;|0:|6: begin|58: LibHandle := LoadLibrary(PAnsiChar('UnityPlayer.dll'));|0:|25: if LibHandle <> 0 then|10: begin|60: fUnityMain := GetProcAddress(LibHandle, 'UnityMain');|33: if @fUnityMain <> nil then|20: fUnityMain;|9: end;|21: fUnityMain := nil;|26: FreeLibrary(LibHandle);|7: end; |0:|4:end.|
}
Add(Thread,9213313,259,140)
{
Delay=0
FastStop=0
link(onExec,14221949:doLoad,[])
}

вдруг кому то будет полезно, можно нарисовать свой лаунчер для игры на unity
или adobe air
немного изменив inlinecode


   LibHandle := LoadLibrary(PAnsiChar('Adobe AIR.dll'));

if LibHandle <> 0 then
begin
fUnityMain := GetProcAddress(LibHandle, 'CaptiveAppEntryWinMain');
if @fUnityMain <> nil then
fUnityMain(0,LibHandle);
карма: 1

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