![]() |
|
|
|
|
#1
|
|||
|
|||
|
Как при динамической загрузке DLL (Loadlibrary - freelibrary) сохранить результат, а имеено обработанный массив в процедуре в DLL?
Происходит все так, я посылаю одни даные для обработки в DLL, а оттуда возвращаю массив. После использования freelibrary результат(массив) обнуляется, а мне его нужно сохранить для дальнейшей работы. как это сделать? |
|
#2
|
||||
|
||||
|
Передавать массив для обработки с параметром VAR или передавать ссылку на массив.
Код:
type TArr = array[0..10] of Byte; PArr = ^TArr; ............. // Вариант 1 с VAR procedure DoSomething1(var Arr : TArr); begin ....... end; // Вариант 2 с указателями procedure DoSomething2(Arr : PArr); begin ............ end; |
|
#3
|
|||
|
|||
|
после выгрузки dll (freelibrary) выдает сообщение об ошибке:
что не так? Код:
{текст программы использующей dll}
program use_dll;
{$APPTYPE CONSOLE}
uses
Windows,
dialogs;
var
hModule: THandle;
pGetSum: function(const n1, n2: integer): integer;
n: integer;
s:string;
begin
hModule := LoadLibrary('dll.dll');
assert(hModule <> 0, 'Can''t load DLL!');
pGetSum := GetProcAddress(hModule, 'getsum');
assert(@pGetSum <> nil, 'Can''t find the getSum function!');
n := pGetSum(10, 20);
str(n,s);
showmessage(s);
FreeLibrary(hModule);
end.Код:
{Текст самой dll}
library dll;
uses
Sharemem,
SysUtils,
Classes;
function getsum(const n1, n2: integer): integer;
begin
result:=n1+n2;
end;
exports getsum;
begin
end. |
|
#4
|
||||
|
||||
|
Цитата:
Ну во-первых ShareMem тут не к чему, а во вторых попробуй явно указать тип передачи параметрой stdcallback, например |