[Delphi] Определение полного захода в Steam

Для тех, кто хочет сделать мир лучше.
Сообщение
Автор
eldest
Разработчик
Разработчик
Сообщения: 302
Зарегистрирован: 17.03.2008
Откуда: такие как я?
Поблагодарили: 2 раза
Контактная информация:

#16 Сообщение 07.07.2010, 02:05

Dr_Quake писал(а):Вы вообще про что? Какая на фиг библиотека, можно тупо сделать импорт и не извращаться даже с динамической загрузкой.
Думаю нужные импорты можно взять у Андрея.
и не извращаться даже с динамической загрузкой
Я извращен.

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#17 Сообщение 07.07.2010, 09:38

eldest писал(а):Darth Revan
Вот так наверное

Код: Выделить всё

type
    SteamIsLoggedIn_t = function(pbIsLoggedIn: Integer; pError: TSteamError): int; virtual; cdecl;

const
    SteamIsLoggedIn: SteamIsLoggedIn_t = nil;

var
    steamDLL: THandle;
 
steamDLL := LoadLibrary('steam.dll');

try
    @SteamIsLoggedIn := GetProcAddress(steamDLL, 'SteamIsLoggedIn');
    SteamIsLoggedIn(<pbIsLoggedIn>, <pError>);
finally
    FreeLibrary(steamDLL);
end;
Не так, а вот так:

Код: Выделить всё

function SteamIsLoggedIn(pbIsLoggedIn: pInteger; pError: pSteamError): Integer; cdecl; external "Steam.dll";
Ты забыл про указатели ;)

В аттаче - часть исходников, там есть почти все функции Steam.dll (только там они направлены на экспорт, переделать по подобию описанной выше - добавить "external "Steam.dll";").
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

Аватара пользователя
Darth Revan
Майор
Майор
Сообщения: 784
Зарегистрирован: 30.09.2008
Поблагодарили: 1 раз
Контактная информация:

#18 Сообщение 07.07.2010, 12:40

Код: Выделить всё

function SteamIsLoggedIn(pbIsLoggedIn: pInteger; pError: pSteamError): Integer;
  cdecl; external 'Steam.dll';

function MySteamIsLoggedIn: Integer;
var
  steamDLL: THandle;
  pbIsLoggedIn: pInteger;
begin
  steamDLL := LoadLibrary('Steam.dll');
  try
    @SteamIsLoggedIn := GetProcAddress(steamDLL, 'SteamIsLoggedIn');
    SteamIsLoggedIn(pbIsLoggedIn, pError);
  except
    Result := -1;
  end;
  FreeLibrary(steamDLL);
  Result := pbIsLoggedIn;
end;
Переделал вот так, но pSteamError и TSteamError не существует.

Аватара пользователя
Dr_Quake
Майор
Майор
Сообщения: 654
Зарегистрирован: 10.03.2008
Поблагодарили: 6 раз
Контактная информация:

#19 Сообщение 07.07.2010, 13:05

Да вы совсем долбанулись ради boolean результата?! Это в 2 действия делается для этой одной функции.

asm
push @someint
push @someint2
call dword ptr [SteamIsLoggedIn]
mov eax,someintresult
end;

А далее по обстановке. Ну и в синтаксисе не уверен, это ж делфи.

Аватара пользователя
Darth Revan
Майор
Майор
Сообщения: 784
Зарегистрирован: 30.09.2008
Поблагодарили: 1 раз
Контактная информация:

#20 Сообщение 07.07.2010, 14:33

Dr_Quake
И что с этим дальше делать?

eldest
Разработчик
Разработчик
Сообщения: 302
Зарегистрирован: 17.03.2008
Откуда: такие как я?
Поблагодарили: 2 раза
Контактная информация:

#21 Сообщение 07.07.2010, 14:44

Dr_Quake
Ну тогда надо звать x_000, может он его асму научит.

Fire666
Эксперты no-Steam
Эксперты no-Steam
Сообщения: 2600
Зарегистрирован: 15.02.2007
Откуда: Москва
Благодарил (а): 2 раза
Поблагодарили: 44 раза
Контактная информация:

#22 Сообщение 07.07.2010, 15:11

Код: Выделить всё

TSteamError pError;
bool pbIsLoggedIn;

SteamIsLoggedIn( pbIsLoggedIn, pError );

int CSteamFunc::SteamIsLoggedIn( bool &pbIsLoggedIn, TSteamError &pError )
{
	FARPROC FuncAdr = GetProcAddress(SteamDLL, "SteamIsLoggedIn");

	int funcexec = ((bool (__cdecl *)( bool &, TSteamError & ))FuncAdr)( pbIsLoggedIn, pError );

	return funcexec;
}

Аватара пользователя
Darth Revan
Майор
Майор
Сообщения: 784
Зарегистрирован: 30.09.2008
Поблагодарили: 1 раз
Контактная информация:

#23 Сообщение 07.07.2010, 20:14

eldest
Асм идёт у меня после С++ в списке.

fire64
Но при этом С++ я понимаю слабо (особенно, это касается типов и функций экспортируемых или импортируемых).

Добавлено спустя 42 минуты 50 секунд:
andreil
C PSteamError разобрался (вынул из Steam_Account.pas), но ни мой вариант, ни eldest'а не работают.

Аватара пользователя
Dr_Quake
Майор
Майор
Сообщения: 654
Зарегистрирован: 10.03.2008
Поблагодарили: 6 раз
Контактная информация:

#24 Сообщение 07.07.2010, 22:41

Работать с ним. Это вообще оформление было для delphi.

Аватара пользователя
Darth Revan
Майор
Майор
Сообщения: 784
Зарегистрирован: 30.09.2008
Поблагодарили: 1 раз
Контактная информация:

#25 Сообщение 07.07.2010, 22:44

Dr_Quake
Обрамление в asm и end; ещё не делает код basm-совместимым.

Аватара пользователя
Dr_Quake
Майор
Майор
Сообщения: 654
Зарегистрирован: 10.03.2008
Поблагодарили: 6 раз
Контактная информация:

#26 Сообщение 07.07.2010, 23:07

Delphi хватит вполне...

Аватара пользователя
x_000
Полковник
Полковник
Сообщения: 4889
Зарегистрирован: 25.02.2008
Откуда: Deutsches Reich
Благодарил (а): 6 раз
Поблагодарили: 18 раз

#27 Сообщение 08.07.2010, 03:22

вы тут вообще о чем
пока я вижу тут только какой-то жуткий-жуткий файровский код
и, насколько я помню, в стим.длл функции совсем не cdecl, а stdcall

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#28 Сообщение 09.07.2010, 01:56

x_000 писал(а):вы тут вообще о чем
пока я вижу тут только какой-то жуткий-жуткий файровский код
и, насколько я помню, в стим.длл функции совсем не cdecl, а stdcall
Как раз cdecl ;)
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

Аватара пользователя
x_000
Полковник
Полковник
Сообщения: 4889
Зарегистрирован: 25.02.2008
Откуда: Deutsches Reich
Благодарил (а): 6 раз
Поблагодарили: 18 раз

#29 Сообщение 09.07.2010, 02:17

нда? а стек вроде вызываемая функция подчищает, или нет? может я это в стимклиент видел? приду домой, посмотрю точно
забыл уже, что и как в либах стима вызывается :(

Добавлено спустя 2 минуты 41 секунду:
а, я все-таки не прав. там действительно цдекл %)

eldest
Разработчик
Разработчик
Сообщения: 302
Зарегистрирован: 17.03.2008
Откуда: такие как я?
Поблагодарили: 2 раза
Контактная информация:

#30 Сообщение 09.07.2010, 19:30

Код: Выделить всё

STEAM_API int STEAM_CALL SteamIsLoggedIn (int *pbIsLoggedIn, TSteamError *pError);

int MySteamIsLoggedIn(void) {
    int pbIsLoggedIn = 0;
    TSteamError pError; // = new TSteamError;
    return (SteamIsLoggedIn(&pbIsLoggedIn, pError) ? pbIsLoggedIn : -1);
}

int IsLoggedIn = MySteamIsLoggedIn(); // 1 - logged in, 0 - not logged in, -1 - Error

Ответить