![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите пример исходника программы работающей с dll ?
Not © (2006-09-13 04:21:00)Нужно, чтобы программа могла работать с dllками.
Программа вызывает dll - Dll - может вызывать некие нужные ей функции программы - и под конец возвращает результат своей работы.
Как такое можно организовать ?
Если можно, дайте исходники примеров такой программы и Dll ?
Zeqfreed (2006-09-16 09:17:00) [1]> [26] Not (16.09.06 03:50)
Разумеется, в Си нет TStream, тем более Си знать ничего не знает о классах Delphi. Так что нельзя.
Not (2006-09-16 03:50:00) [2]Имею в виду Stream, а не Thread.
Германн (2006-09-16 03:21:00) [3]Я, пожалуй, пойду спать. Потоки, процессоры многоядерные, имхо - перебор.
Zeqfreed (2006-09-16 03:12:00) [4]> [23] Not (16.09.06 03:08)
> А через потоки это можно делать одновременно и в Си и в
> Дельфи?
Делать что? Одновременно получится только на дву- и более ядерном процессоре :)
Что ты собираешься делать в потоках то? И, главное, зачем?
Not (2006-09-16 03:08:00) [5]А через потоки это можно делать одновременно и в Си и в Дельфи?
Германн (2006-09-16 02:40:00) [6]
> Not (16.09.06 02:22) [20]
>
> А как мне тогда быть то?
> Мне надо, чтобы на любом языке плагины писать можно было
> бы.
> <Цитата>
>
> Zeqfreed © (16.09.06 02:25) [21]
>
> > [20] Not (16.09.06 02:22)
>
> Учимся активно испльзовать указатели и динамическое распределение
> памяти aka GetMem/FreeMem, StrAlloc/StrDispose, GlobalAlloc/GlobalFree.
>
Именно так!
Zeqfreed (2006-09-16 02:25:00) [7]> [20] Not (16.09.06 02:22)
Учимся активно испльзовать указатели и динамическое распределение памяти aka GetMem/FreeMem, StrAlloc/StrDispose, GlobalAlloc/GlobalFree. Хотя я обычно ограничиваюсь первой парой.
Not (2006-09-16 02:22:00) [8]А как мне тогда быть то?
Мне надо, чтобы на любом языке плагины писать можно было бы.
Германн (2006-09-16 02:22:00) [9]
> Ну да, там будет даже два «управляльщика». И именно потому
> что они не подозревают друг о друге, при некоторых операциях
> может случиться «бяка». Но, например, операции чтения/записи
> можно проводить вполне безопасно.
>
Ну да. Как раз сей совет "очень подходит для конференции Начинающие"! :-((
С [16] согласен. Но и ещё раз! В dll лучше использовать "родные" типы. Т.е. PChar.
Zeqfreed (2006-09-16 02:10:00) [10]> [17] Германн © (16.09.06 02:02)
> И если они есть, то ведь должен же быть кто-то, кто будет
> управлять!
Ну да, там будет даже два «управляльщика». И именно потому что они не подозревают друг о друге, при некоторых операциях может случиться «бяка». Но, например, операции чтения/записи можно проводить вполне безопасно.
Германн (2006-09-16 02:02:00) [11]
> Zeqfreed © (16.09.06 01:40) [14]
>
> > [13] Германн © (16.09.06 01:30)
>
> Если быть аккуратным, то можно работать с динамическими
> массивами, да и строками в принципе без ShareMem :)
"Если быть аккуратным" это как это? Мыть руки перед работой с данными типами? :-)
Имхо, есть в дельфи типы с "управляемым временем жизни". И если они есть, то ведь должен же быть кто-то, кто будет управлять!
Zeqfreed (2006-09-16 01:51:00) [12]> [15] Not (16.09.06 01:47)
> А если из dll менять разменость массива, то это ничего?
Зависит от ситуации. Я бы все-таки не советовал пренебрегать предупреждением разработчиков и подключил таки ShareMem. Но если необходимо работать с библиотекой из Си, то о Ansi-строках и динамических массивах придется забыть :)
Not (2006-09-16 01:47:00) [13]
> Zeqfreed © (16.09.06 01:17) [12]
> > А как это перевести?
>
> Если хочешь передавать длинные строки, то надо добавить
> ShareMem первым модулем в списке uses, как в приложении,
> так и в библиотеке.
Спасибо.
> Ну если не делать ничего предосудительного, тогда можно
> и динамические массивы использовать.
А если из dll менять разменость массива, то это ничего?
И ещё, с этим можно будет работать из Си?
Zeqfreed (2006-09-16 01:40:00) [14]> [13] Германн © (16.09.06 01:30)
Если быть аккуратным, то можно работать с динамическими массивами, да и строками в принципе без ShareMem :)
Германн (2006-09-16 01:30:00) [15]
> Если хочешь передавать длинные строки, то надо добавить
> ShareMem первым модулем в списке uses, как в приложении,
> так и в библиотеке.
>
И динамические массивы тоже подпадают в ту же категорию.
Zeqfreed (2006-09-16 01:17:00) [16]> [11] Not (16.09.06 01:11)
> Но здесь же передаётся просто record. А мне нужно рекорд
> с динамическими массивами. Или это всё равно?
Ну если не делать ничего предосудительного, тогда можно и динамические массивы использовать.
> А как это перевести?
Если хочешь передавать длинные строки, то надо добавить ShareMem первым модулем в списке uses, как в приложении, так и в библиотеке.
Not (2006-09-16 01:11:00) [17]
> Zeqfreed © (15.09.06 01:33) [9]
Но здесь же передаётся просто record. А мне нужно рекорд с динамическими массивами. Или это всё равно?
> Zeqfreed © (15.09.06 01:34) [10]
А как это перевести?
Zeqfreed (2006-09-15 01:34:00) [18]> [8] Not (15.09.06 01:32)
> Какой комментарий?
Вот этот:
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
Zeqfreed (2006-09-15 01:33:00) [19]> [6] Not (15.09.06 01:14)
> А как именно ? Можно пример ?
SharedTypes.pas:
unit SharedTypes;
interface
type
PMyStruct = ^TMyStruct;
TMyStruct = record
a,b,c : Integer;
end;
implementation
end.
Main.pas:
uses
…, SharedTypes, …;
. . .
procedure TForm1.Button1Click(Sender: TObject);
type
TModifyMyStructProc = procedure(Struct : PMyStruct);
var
h : THandle;
Proc : TModifyMyStructProc;
Struct : TMyStruct;
begin
with Struct do begin
a := 5;
b := 5;
c := 5;
end;
h := LoadLibrary('../lib/lib.dll');
if (h <> 0) then begin
Proc := GetProcAddress(h, 'ModifyMyStruct');
if (@Proc <> nil) then Proc(PMyStruct(@Struct));
FreeLibrary(h);
end;
with Struct do
ShowMessageFmt('Modified struct: %d %d %d', [a, b, c]);
end;
lib.dpr:
library lib;
uses
Windows,
SharedTypes in '..\SharedTypes.pas';
procedure ModifyMyStruct(Struct : PMyStruct);
begin
with Struct^ do begin
a := a + 1;
b := b + 2;
c := c - 1;
end;
end;
exports
ModifyMyStruct;
begin
end.
Что-то типа такого :)
Not (2006-09-15 01:32:00) [20]Непонял. Какой комментарий?
Можно пример ?