![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
неявное связывание с bpl [XP]
sydenis © (2007-10-01 14:54:00)если использовать функцию из bpl путём неявного связывания со своей программой типа
unit MyProg;
......
function FuncFromBPL: Byte; stdcall; external 'MyPackage.bpl';
то обязательно надо ставить галочку "build with runtime packages"?
Как-то неудобно это - сразу вся VCL и всё прочее выгружается в пакеты... А хотелось бы как с dll - всё в exeшнике, и что-то выборочно из dll
Игорь Шевченко (2007-10-01 15:43:00) [21]
> И, кстати, в том пакете функция объявлена именно как stdcall
> (зачем???), или ты это так, написал потому что где-то увидел?
>
AFAIK на имя экспортируемой фукнции влияет.
sydenis (2007-10-01 15:41:00) [22]
> в том пакете функция объявлена именно как stdcall (зачем?
> ??), или ты это так, написал потому что где-то увидел?
да - просто "где-то увидел"... а в bpl нормальный (паскалевский) порядок аргументов?
> Можно не ставить.
Вот и я пробовал не ставить и всякий раз ловил AV, хотя судя по отладчику управление нормально передавалось в пакет, но функция не исполнялась. Правда там (в функции) было создание новой формы, т.е. как раз использование RTL/VCL... значит всё-таки без глаки не обйтись?
D2007
DrPass (2007-10-01 15:10:00) [23]
> то обязательно надо ставить галочку "build with runtime
> packages"?
Не обязательно. Но если твоя функция использует что-либо из RTL/VCL, то без этой галочки будет нехорошо :)
Т.к. пакет-то тянет зависимости только из других пакетов, а в твоем приложении будет вкомпилирована своя собственная копия RTL.
И, кстати, в том пакете функция объявлена именно как stdcall (зачем???), или ты это так, написал потому что где-то увидел?
Сергей М. (2007-10-01 15:07:00) [24]
> обязательно надо ставить галочку "build with runtime packages"?
Не обязательно.
Игорь Шевченко (2007-10-01 15:07:00) [25]
> то обязательно надо ставить галочку "build with runtime
> packages"?
Можно не ставить.
package MyPkg;
.....
requires
rtl;
contains
PkgMain in 'PkgMain.pas';
end.
unit PkgMain;
interface
function Foo: Integer; stdcall;
exports Foo;
implementation
uses
Windows;
function Foo: Integer;
begin
Result := MessageBox(HWND_DESKTOP, 'Foo has been called', 'Package', MB_OK);
end;
end.
program PkgUser;
uses
Forms,
main in 'main.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
function Foo: Integer; stdcall; external 'MyPkg.bpl';
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Foo;
end;
end.
sydenis (2007-10-01 14:57:00) [26]про LoadPackage и GetProcAddress просьба не рассказывать - интересует именно вышеописанный случай