Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2018, 22:07   #1
D-monua
 
Регистрация: 19.11.2017
Сообщений: 8
Восклицание Не работает Rtti.Invoke под х64

Доброго времени ситок.

Этот код под Win32 работает нормально:

DLL
Код:
library InvokeDLL;

uses
  System.SysUtils,
  System.Classes;

{$R *.res}

function Echo(AStr: string; AInt: string): string; stdcall; export;
begin
  Result := AStr + ' - ' + AInt;
end;

function Echo1: string; stdcall; export;
begin
  Result := 'Echo1';
end;

exports
  Echo,
  Echo1;

begin
end.
Вызов происходит таким образом:
Код:
...
procedure TForm3.Button1Click(Sender: TObject);
var
  PAddr: pointer;
  vParams: TArray<TValue>;
  s: string;
begin
  if Handle > 0 then begin
    PAddr := GetProcAddress(Handle, 'Echo1');
    if PAddr = nil then
      raise Exception.CreateFmt('Procedure "%s" not found in "%s"', ['Echo1', 'InvokeDLL.dll']);

    SetLength(vParams, 0);
    s := System.Rtti.Invoke(PAddr, vParams, ccStdCall, TypeInfo(string)).AsString;
    ShowMessage(s);

    PAddr := GetProcAddress(Handle, 'Echo');
    if PAddr = nil then
      raise Exception.CreateFmt('Procedure "%s" not found in "%s"', ['Echo', 'InvokeDLL.dll']);

    SetLength(vParams, 2);
    vParams[0] := 'Test';
    vParams[1] := '13';
    s := System.Rtti.Invoke(PAddr, vParams, ccStdCall, TypeInfo(string)).AsString;
    ShowMessage(s);
  end;
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeLibrary(Handle);
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  Handle := LoadLibrary('InvokeDLL.dll');
  if Handle = 0 then
    raise Exception.CreateFmt('Error load library "%s"', ['InvokeDLL.dll']);
end;
...
Вопрос собственно такой. Как этот код заставить работать под Win64?

Последний раз редактировалось D-monua; 11.06.2018 в 12:10.
D-monua вне форума Ответить с цитированием
Старый 11.06.2018, 12:12   #2
D-monua
 
Регистрация: 19.11.2017
Сообщений: 8
По умолчанию

Маленькая поправочка.
При вызове мотода без параметров все ОК, а вот как только начинаешь вызывать с параметрами, валится.
D-monua вне форума Ответить с цитированием
Старый 11.06.2018, 13:32   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

менеджер памяти подключите чтобы использовать string в dll.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
RTTI. Заполнение произвольной структуры. Delphi_ProGer Общие вопросы Delphi 4 05.08.2012 10:02
Проект Access 2010 х64 (adp) не хочет работать с SQL Server 2008 х64 ten50 Microsoft Office Access 0 18.04.2011 20:10
Совместимость SQL Server 2008 х64 и Проекта Access 2010 х64 (*.adp) ten50 SQL, базы данных 0 16.04.2011 17:15
Совместимость Проекта Access 2010 х64 (*.adp) и SQL Server 2008 х64 ten50 Microsoft Office Access 0 16.04.2011 17:12