Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Embarcadero RAD Studio XE3

Автор: Arioch1
Дата сообщения: 13.01.2013 12:14
Spring4Delphi : http://www.spring4d.org/general/rebirth-of-spring4d/

но если ее всерьез использовать - от XE2 начинает глючить и падать.
Некоторые из этих багов в ХЕ3 исправили, впрочем. В ХЕ2 не стали, гады, оттягивали...
Автор: Blind
Дата сообщения: 14.01.2013 05:31
Frodo_Torbins
Arioch1
Благодарю
Автор: deks
Дата сообщения: 14.01.2013 08:16
HeMet

А зачем проект VS пихать в проект Delphi?

Не проще ли сделать нормальную DLL в VS и уже нормально использовать эту DLL в Delphi?

Ну или любой иной метод IPC на Windows - заканчивая REST-сервером. Кстати, под XE3 LiveTile на Win8 так и сделан - это REST сервер написанный на VS, который по HTTP работает с Desktop Win-приложением Delphi.
Автор: HeMet
Дата сообщения: 14.01.2013 16:25
deks
Полу-академический интерес. Цель библиотека Detours. Так же по роду хобби приходится периодически заниматься обратной разработкой форматов файлов для различных игр и, соответственно, писать утилиты для работы с ними (разумеется, продукция некоммерческая и всё ради самообразования , и не хочется к небольшой утилите добавлять внешние зависимости, особенно если утилита позиционируется, как универсальная.

P.S. С зависимостями от new/delete разобрался, достаточно откомпилить в объектник такой вот код:


Код:
extern "C" void* new_impl(size_t n);
extern "C" void delete_impl(void* p);

void operator delete(void* p)
{
    delete_impl(p);
}

void* operator new (size_t n)
{
    return new_impl(n);
}
Автор: AlekXL
Дата сообщения: 14.01.2013 16:55
вопрос новичка. Если у меня в переменной A ссылка на аноним, а мне нужна независимая копия с тем же (по значению) контекстом в переменной b .. это возможно сделать?
Автор: HeMet
Дата сообщения: 14.01.2013 17:12
AlekXL
Анонимные функции реализованы через интерфейсы. При её создании происходит захват контекста и он отправляется в поля класса, реализующего интерфейс. Но клонировать анонимные методы, на сколько я знаю нельзя (штатными средствами) — они для этого не спроектированы.
Поэтому, вероятно, нужно будет сделать метод-фабрику, которой передается контекст, а она возвращает анонимку и вызывать столько раз, сколько нужно копий.
Автор: DeathMAD
Дата сообщения: 14.01.2013 23:50

Код: if Assigned(AProc) then
begin
IInterface(PPointer(@AProc)^)._AddRef;
FAnonymousProcedure := PPointer(@AProc)^;
end;
Автор: AlekXL
Дата сообщения: 15.01.2013 02:53

Цитата:
if Assigned(AProc) then
begin
IInterface(PPointer(@AProc)^)._AddRef;
FAnonymousProcedure := PPointer(@AProc)^;
end;

это вряд ли сработает..

Цитата:
Анонимные функции реализованы через интерфейсы.

Нет, не через интерфес. Я смотрел в дизассемблере. Через класс.

Этот класс напрямую унаследован от TInterfacedObject, и внутренне, автоматически определяется компилятором на основе анализа кода анонимного метода. Этот класс имеет по крайней базовый RTTI, имя (через TObject.ClassName оно видно как TSomeClass.SomeMethodAnonymOne - как то так).
Автор: DeathMAD
Дата сообщения: 15.01.2013 07:59
Сработает точно.
Автор: Arioch1
Дата сообщения: 15.01.2013 10:50
> функции реализованы через интерфейсы.
> класс напрямую унаследован от TInterfacedObject

не вижу большой разницы.

В Delphi можно реализовать интерфейс инaче чем через класс ?
Автор: HeMet
Дата сообщения: 15.01.2013 16:14

Цитата:
if Assigned(AProc) then  
begin    
IInterface(PPointer(@AProc)^)._AddRef;    
FAnonymousProcedure := PPointer(@AProc)^;  
end;

По-моему, речь шла о копировании контекста анонимного метода, а у Вас один контекст на обе анонимки. Разве компилятор не сделает тоже самое, если написать FAnonymousProcedure := aProc ?


Цитата:
В Delphi можно реализовать интерфейс инaче чем через класс ?

Можно, например прицепив к записям VMT, но это уже хаки. Вот пример библиотеки для работы с большими числами, которая использует интерфейсы на записях http://sergworks.wordpress.com/2012/04/01/interfaces-without-objects/
Автор: DeathMAD
Дата сообщения: 15.01.2013 16:19
Там у меня были сложности, с дженериковым объявлением. Нельзя было объявить FAnonymousProcedure. Но да, контекст один и тот же. Можно зайти с другой стороны и попробовать сделать бинарную копию TFrameObject'а.
Автор: HeMet
Дата сообщения: 15.01.2013 16:27
DeathMAD
Вчера пробовал. То в одном месте косяки вылезали, то в другом. Так и не получилось с первого раза добиться полностью работающего варианта. Самое лучшее, что получилось — это склонировать анонимку, но при этом получал AV при освобождении объекта, который она захватывает.

http://blog.barrkel.com/2008/11/somewhat-more-efficient-smart-pointers.html
В коментах к этой статье Барри Келли говорит, что ссылка на контекст находится в локальной переменной метода Invoke.
Автор: SolidSnakeRU
Дата сообщения: 17.01.2013 21:19
Достает древний косяк:
Окно структуры приложения - там где классы и т.п. показывает ошибки хотя их нет (например: does not contain a member у мемо не видит метод Add, который есть ).
Какие-то проблемы с проверкой синтаксиса и видимостью модулей что ли, при этом все компилится и работает.
Бывает протыкаешь по модулям и исчезает - вроде ерунда, но достало.
Может кто знает, есть способ фикса?
Автор: Arioch1
Дата сообщения: 17.01.2013 21:23
выучить J#
устроиться в Embarcadero бесплатно
и переписать парсеры в IDE (которых как говорят несколько, для разных участков кода. Этого я не понял вообще и выпал в осадок.
Автор: AlekXL
Дата сообщения: 18.01.2013 05:55

Цитата:
> функции реализованы через интерфейсы.
> класс напрямую унаследован от TInterfacedObject

не вижу большой разницы.

В Delphi можно реализовать интерфейс инaче чем через класс ?

как раз в анонимах "интерфейс" реализован не через класс. Вернее, не обычным для класса методом виртуальных таблиц. У класса , реализующего аноним, виртуальная таблица анонима НЕ СОВПАДАЕТ с виртуальной таблицей самого класса. Это точно.
Последним членом такого класса будет ссылка на виртуальную таблицу анонима, кажись.



Добавлено:

Цитата:
выучить J#
устроиться в Embarcadero бесплатно
и переписать парсеры в IDE (которых как говорят несколько, для разных участков кода. Этого я не понял вообще и выпал в осадок.

как раз учить j# , этого мертвого последыша не стоит. Лучше переделать с ноля. Какого х. связывать среду с доднетом? Чтобы она запускалась медленней? Нет , ВСЕ в дельфи д.б. либо PUREPASCAL либо ASM.

У меня лично большие надежды на то, что паскаль портируют под CLANG/LLVM кодеген. Представляете, каким быстрым и замечательным инструментом станет наш язык?!
Автор: Frodo_Torbins
Дата сообщения: 18.01.2013 11:25
Arioch1, AlekXL
Просто у них уже были какие то наработки на джаве, вот они и решили сэкономить на переписывании, заюзав модный тогда J#. Сейчас они уже и сами не рады таскать за собой этого зомби. Собственно LLVM как раз и должен решить эту проблему.
Автор: Arioch1
Дата сообщения: 18.01.2013 11:29
..и наработки по Delphi.Net
Иначе бы они завязали бы среду не на .Net, а на JVM

Но вообще, чтобы связаться с J# надо было быть или большим оптимистом или большим пофигистом...
Автор: A_V
Дата сообщения: 18.01.2013 12:03
AlekXL

Цитата:
Если у меня в переменной A ссылка на аноним, а мне нужна независимая копия с тем же (по значению) контекстом в переменной b .. это возможно сделать?

если я правильно понял, то что-то типа такого (для delphi>=2010):

Код:

type
TRefProcAdapter<T> = class
class function MakeCopy(ARefProc: T): T;
end;
...

uses System.Rtti, System.TypInfo;
...

class function TRefProcAdapter<T>.MakeCopy(ARefProc: T): T;
type
PInterface = ^IInterface;
var
ProcType: TRttiInstanceType;
RefObj: TObject;
ResultObj: TObject;
f: TRttiField;
begin
Assert(PTypeInfo(TypeInfo(T)).Kind = tkInterface);
RefObj := PInterface(@ARefProc)^ as TObject;
ResultObj := RefObj.ClassType.Create;
ProcType := TRttiContext.Create.GetType(RefObj.ClassInfo) as TRttiInstanceType;
Assert(Assigned(ProcType));
for f in ProcType.GetDeclaredFields do
f.SetValue(ResultObj, f.GetValue(RefObj));
ResultObj.GetInterface(GetTypeData(PTypeInfo(TypeInfo(T))).Guid, Result);
end;

Автор: HeMet
Дата сообщения: 18.01.2013 15:35

Цитата:
как раз в анонимах "интерфейс" реализован не через класс. Вернее, не обычным для класса методом виртуальных таблиц. У класса , реализующего аноним, виртуальная таблица анонима НЕ СОВПАДАЕТ с виртуальной таблицей самого класса. Это точно.

У них одинаковая реализация. Пример:
[more=Классы и интерфейсы]
Код:
program interfaces;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils;

type
TMyClass = class
public
fInteger: Integer;
end;

IIntf1 = interface
procedure PrintOne;
end;

IIntf2 = interface
procedure PrintTwo;
end;

TMyIClass = class(TInterfacedObject, IIntf1, IIntf2)
private
i: Integer;
public
constructor Create;
procedure PrintTwo;
procedure PrintOne;
end;

{ TMyIClass }

constructor TMyIClass.Create;
begin
inherited;
i := $07070707;
end;

procedure TMyIClass.PrintOne;
begin
WriteLn(1);
end;

procedure TMyIClass.PrintTwo;
begin
WriteLn(2);
end;


var
i1: IIntf1;
i2: IIntf2;
mc: TMyIClass;

begin
try
mc := TMyIClass.Create;
i1 := mc;
i2 := mc;
i1.PrintOne;
i2.PrintTwo;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Автор: Eternal_Shield
Дата сообщения: 18.01.2013 21:13
HeMet
Если не такой большой секрет, то для чего сие сакральное клонирование анонимов нужно? Просто интересно...
Автор: HeMet
Дата сообщения: 18.01.2013 21:42
Eternal_Shield
Честно, в душе не шарю XD Человек спросил «а можно ли?» и мне стало интересно, можно или нет, заодно посмотрел как реализованы интерфейсы и анонимки под капотом компилятора. Можно считать ненормальным программированием
Единственное, что могу предположить это когда контекст от вызова к вызову изменяется, а нужно передать анонимку в разные подсистемы, а метод-фабрика не доступен.
Автор: AlekXL
Дата сообщения: 18.01.2013 21:46

Цитата:
Если не такой большой секрет, то для чего сие сакральное клонирование анонимов нужно? Просто интересно...
я просто хотел знать, возможно ли это. И узнал - теоретически - возможно. Но труднореализуемо.
Наверняка, например захваченную, переменную типа Tbytes код не сможет скопировать, из-за бага в компиляторе.
И сам ход обсуждения помогает лучше понять сущность замыканий.


Добавлено:
вот практический вопрос. Я столкнулся с ним, еще когда делал DS REST на XE2. Там ведь вся ролевая система разграничения прав строится на атрибутах.
Так вот, в 64-разрядном отладочном (FULLDEBUGMODE) режиме FastMM последней версии(как и других, наверное) портит какие-то данные атрибутов, так что приложение не может считать их, и в итоге неработоспособно.

я также попробовал скомпилить (тоже в 64) свой тестовый проект на XE3, использующий Delphi Spring, которому с помощью атрибута указывал на подходящий к-тор.Так вот, FastMM портит и там.

Может, кто подскажет, какие свитчи потрогать, чтобы не было этой проблемы?
Автор: Arioch1
Дата сообщения: 18.01.2013 22:04
может FastMM обновить ?
Автор: GlavBuh
Дата сообщения: 19.01.2013 18:38
Pascal впервые обогнал Delphi/Object Pascal в индексе популярности TIOBE Programming Community Index за январь 2013.
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Пожелание разработчикам Delphi: еще больше усильте защиту от пиратства. Можно применить хардварные ключи, отпечатки пальцев и сканеры радужной оболочки.
Автор: sergionn
Дата сообщения: 21.01.2013 13:16
какая то хрень происходит:
сначала главный архитектор Smart Mobile studio попал в аварию,
теперь вот пишут что с главным архитектором Mobile Studio тоже случились неприятности, и имеет место быть задержка выхода продукта ..............

Автор: Arioch1
Дата сообщения: 21.01.2013 13:23
...а вот если бы они готовили среду для Windows Phone 8...
Автор: HeMet
Дата сообщения: 21.01.2013 16:53

Цитата:
теперь вот пишут

Где такие вещи пишут?
Автор: sergionn
Дата сообщения: 21.01.2013 16:55

Цитата:
Где такие вещи пишут?

_http://www.board4allcz.eu/showthread.php?t=531812
Автор: HeMet
Дата сообщения: 21.01.2013 17:45
sergionn
Там только про Smart Mobile Studio. Про Mobile Studio от Эмбы ничего печального.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738

Предыдущая тема: [Delphi XE2] Размер PNG


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.