Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / По поводу dll / 10 сообщений из 10, страница 1 из 1
18.03.2003, 05:52
    #32121637
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу dll
Народ, я смотрю тут много вопросов по dll. Если что могу кинуть пример работающей библиотеки и кусок кода п приложении
...
Рейтинг: 0 / 0
18.03.2003, 15:42
    #32122228
dimas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу dll
брось всем будет только на пользу
...
Рейтинг: 0 / 0
18.03.2003, 20:14
    #32122464
aLexx Subb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу dll
Брось мне. Может чего новенького посмотрю. e-mail:grey_ufo@mail.ru
...
Рейтинг: 0 / 0
19.03.2003, 08:09
    #32122549
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу dll
// Вызов библиотеки - ДИНАМИЧЕСКОЙ
Function TMDIChildBase.RunDLL(ConnDB : TConnDB; Params : TParamsA; ParamsDlg : TParamsToDlg): Boolean;
var
RunMDIChild : TRunMDIChild; //объявили переменную типа процедуры - можно локальную, пофиг
CloseLib : TCloseLib;
LibS,CurrentPath : String;
Handle :THandle;
Begin
CurrentPath:=GetCurrentDir;
LibS := Params.Lib+ParamsDlg.NameLib+'.dll';
If FileExists(LibS) Then
Begin
Handle := LoadLibrary(PChar(LibS)); // загрузили библиотеку, если ее еще нет

if Handle <> 0 then // если все пучком...
begin
@RunMDIChild := GetProcAddress(Handle, 'RunMDIChild'); //получили адрес процедуры по ее имени
if @RunMDIChild <> nil then
Result := RunMDIChild(ConnDB, Params, ParamsDlg, Application); // ну и выполнили
FreeLibrary(Handle); // а потом выгрузить библиотеку. Delphi за тебя это не сделает !
end;

End Else ShowMessage(ErrNoFoundLib);
Handle := 0;
SetCurrentDir(CurrentPath);
End;

то что у меня в коде библиотеки
var
oldApp : TApplication;

Function RunEdit (ConnDBt : TConnDB;
ParamsT : TParamsA;
ParamsDlgT : TParamsToDlg; App : TApplication):Boolean;
begin
Application := App;
Result := RunWin(ConnDBt, ParamsT, ParamsDlgT); // обычная функция в которой в частности генениртся форма
Application.ProcessMessages; // дали ей самоуничтожиться (если ее не было, то это не помешает)
Application := oldApp; // восстановили среду приложения библиотеки. После этого уже можно выгружать
end;

exports
RunEdit name 'RunMDIChild';

begin
OldApp:=Application; // эта фишка обязательна для динамической выгрузки библиотеки.
//т.е. нужно сохранить ссылку на родной Application библиотеки, чтобы ее потом можно было
//динамически выгрузить.
end.


Параметры передаваемые в функции это ссылки на классы. Не получилось только передать ссылку на компнент TIBTransaction. Не заработало. Вобщем одно золотое правило. Если приложение выделило память, то ОНО ЖЕ и должно ее освободить. Соответственно так же и dll. Не получилось передать тип variant. Наверное из-за перераспределения памяти. Строки передаются, только в библиотеке лучше только считывать с них данные никак не модифицируя входной параметр. Вот вобщем и все...
...
Рейтинг: 0 / 0
19.03.2003, 08:12
    #32122553
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу dll
Да, забыл... если в dll возник exception, то его следует обработать именно в библиотеке. В противном случае приложение обработав его попытается освободить память закрепленную за объектом TException и получим AV. По этой же причине в библиотеке вредна инструкция raise.
...
Рейтинг: 0 / 0
19.03.2003, 08:14
    #32122555
eNose
Участник
[не активирован]
[не одобрен]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу dll
Передавать строки нежелательно, а вот УКАЗАТЕЛЬ на строку - ради Бога. И тогда и читать можно, и писать в нее.
Теперь про передачу компонента: Передавай прямо в лоб xxx(x: TIBTransaction). Все работать должно (это же адрес). Я так TOracleSession передаю.
...
Рейтинг: 0 / 0
19.03.2003, 12:16
    #32122787
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу dll
Оракловые компоненты может быть и работают. в IBX компонента TIBDatabase прекрасно работает, а эта отказывается... мне кажется это баг компоненты... для справки у меня Delphi5. А с указателями... нельзя перераспределять память. Если твоя строка вписывается в выделенный предел, то все Ok, если нет, то облом. MicroSoft рекомендует вообще юзать PChar. Кстате, у них частенько присутствует алгоритм, когда приложение выделяет память под PChar а библиотека туда пишет значение. В качестве примера функции работы с принтером, GetUserName и прочее
...
Рейтинг: 0 / 0
19.03.2003, 16:49
    #32123118
nicnic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу dll
Вы чего народ? Всё же работает - только надо использовать Sharemem. Подробности в справке.
...
Рейтинг: 0 / 0
20.03.2003, 03:15
    #32123296
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу dll
и тянуть за собой лишнюю dll.... мне показалось это лишним, тем более что у нас по логике работы dll должна работать в выделенной транзакции
...
Рейтинг: 0 / 0
20.03.2003, 07:54
    #32123326
eNose
Участник
[не активирован]
[не одобрен]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По поводу dll
2 nicnic: а причем тут передача хэндла объекта и sharemem.dll?
Уж просвяти неуча
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / По поводу dll / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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