powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получить структуру из С-шной DLL
14 сообщений из 39, страница 2 из 2
Получить структуру из С-шной DLL
    #40086220
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
{$MINENUMSIZE 4}
type
  CTMBeginTransactionError = ( 
    CTM_BEGIN_TRX_SUCCESS, 
    CTM_BEGIN_TRX_ERROR_ALREADY_IN_PROGRESS, 
    CTM_BEGIN_TRX_ERROR_NOT_CONNECTED, 
    CTM_BEGIN_TRX_ERROR_UNHANDLED_EXCEPTION); 

  CTMBeginTransactionResult = record
    szTransactionID: PAnsiChar;
    error: CTMBeginTransactionError;
  end;

  CTMBeginTransactionResultUnion = record
  case Byte of
    0: Val: Int64;
    1: Rec: CTMBeginTransactionResult;
  end;

function CTM_BeginCustomerTransaction(const transactionId: PAnsiChar): Int64; cdecl; 
  external 'libctmclient-0.dll' name 'ctm_begin_customer_transaction';

var
  Res: CTMBeginTransactionResultUnion;
begin
  Res.Val := CTM_BeginCustomerTransaction('123');
  ShowMessageFmt('Id: %s, Error: %d', [Res.Rec.szTransactionID, Ord(Res.Rec.error)]);
end;
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086222
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
CTM_BEGIN_TRX_ERROR_UNHANDLED_EXCEPTION = 99


Код: sql
1.
CTM_BEGIN_TRX_ERROR_UNHANDLED_EXCEPTION


Опаньки...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086229
maremora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Это опечатка.. к общему потоку мысли отношения не имеющая.. но сейчас попробую исправить, "ибо порядок должен быть"
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086232
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Вообще-то это без разницы, сдвиги в дельфи не расширяют знак.

Все же так аккуратнее. Ну и обмазать все это шаманство комментариями, чтобы через месяц не чесать затылок
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086235
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maremoraЭто опечатка..

Хорошо бы цитировать посыл, на который Вы отвечаете. Константа 99 это явно не опечатка и
портировоание enum без её учёта приведёт к неправильным результатам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086252
maremora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
type
  ...
  CTMBeginTransactionResultUnion = record
  case Byte of
    0: Val: Int64;
    1: Rec: CTMBeginTransactionResult;
  end;

var
  Res: CTMBeginTransactionResultUnion;
begin
  Res.Val := CTM_BeginCustomerTransaction('123');
  ShowMessageFmt('Id: %s, Error: %d', [Res.Rec.szTransactionID, Ord(Res.Rec.error)]);
end;



Отдельное спасибо, красиво.
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086296
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,

я ж писал, 'конкретно тут' :) в частном случае нет никакой разницы, компиляторы работают одинаково.

авторПроблема, как я понимаю, в том, что если объявить в Delphi функцию с тем же возвращаемым результатом, как в исходной фунции Си, то в этом возвращаемом результате будет совсем не то, что нужно. Т.е. в Delphi, для 32-битной программы, нужно сделать вот такой хак, как сделал ТС: результат объявить как Int64, а потом, уже после вызова внешней функции, это преобразовать в запись CTMBeginTransactionResult.авторНесуразность выливается в то, что вместо прямого импорта функции и далее работы с полями record как это впрямую выглядит, нужно делать дополнительную неявную обвязку, которая будет мониторить "особенности реализации". Это в некоторой мере нелояльно к сотрудникам поддержки. Прочие моменты можно обсуждать и далее.так это проблема не делфей, а сей, плюсов и шарпа, которые так и не научились нормально хоть что-то передавать наружу/внутрь кроме простых типов и указателей (которые тоже, впрочем, простой тип).

как только record или инстанс класса - так и жопа даже в пределах своего языка.
максимум что смогли придумать - COM, и тот только на винде. и далеко не везде, можно сказать, редко, используется.
исторически сложилось (ц), я понимаю, что на границах dll/exe о чем-то сложнее простых типов никто не думал, так уж получилось и до сих пор так

авторНо вообще-то и сдвиги не нужны, можно использовать Move(), absolute или case. Потом уже просто работаешь со структурой как структурой.угу. absolute или вариантные записи в помощь. впрочем, уже кинули решение :)
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086304
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonмаксимум что смогли придумать - COM, и тот только на винде.

Ты не поверишь, но СОМ описывает только двоичную структуру VMT, а соглашения о вызовах не
трогает от слова "вообще". Причём эта самая VMT - штатно используемая нынче любым
компилятором С++.

"Только на винде" - это фабрика классов и CLSID, хранящиеся в реестре. На линухе их нет
исключительно потому, что в худших линуксовых традициях дистроклепатели не могли
договориться использовать ли им реализацию от Мозиллы или кого-то ещё.

Соглашение "функции возвращают исключительно HRESULT" это уже следующий уровень
соглашений, к собственно СОМ отношения не имеющий (и часто нарушающийся).

PS: И это я ещё не буду вспоминать, что невозможность вызова функции, возвращающей
интерфейс непосредственно, а не как var-параметр - баг лично Дельфи. Возможно даже
исправленный в последних версиях.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086317
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,
Это вон оно чо! Оказывается проблема у майкрософта и си++, а не у Delphi. Надо бы перечитать документацию по соглашениям о вызовах.
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086318
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

PS: И это я ещё не буду вспоминать, что невозможность вызова функции, возвращающей
интерфейс непосредственно, а не как var-параметр - баг лично Дельфи. Возможно даже
исправленный в последних версиях.

Вот еще есть out модификатор и он тоже работает не так, как в си-шарпе.
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086319
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Если ты про out модификатор

Нет, я про невозможность получить результат такой функции:
Код: plaintext
1.
IUnknown* getInteface();


В качестве широко обсосанного примера можно погуглить пляски с бубном вокруг Direct3DCreate9.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086320
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Нет, я про невозможность получить результат такой функции:
Делфя ее в процедуру превращает? В Rio так делается.

Думаю, что здесь сложность в автоматическом подсчете ссылок. Делфе нужно знать, что при присвоении
Код: pascal
1.
LIntf := GetIntf()

не нужно вызывать _AddRef.

А с другой стороны, для кода
Код: pascal
1.
2.
3.
4.
5.
procedure SetIntf(const AIntf: IInterface);
begin
end;

SetIntf(GetIntf) 

получим утечку
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086321
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Делфя ее в процедуру превращает?

Дельфя (и FPC, кстати) внаглую игнорирует объявление cdecl и генерит код для safecall.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Получить структуру из С-шной DLL
    #40086358
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

вот не смогли о нормальной передаче инстансов на границах разных апи сразу договорится и почти все апи - тупо простые типы, как на винде так и, особенно, на линухе. да и так как либу не возьми - то почти везде всё такое же.
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получить структуру из С-шной DLL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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