Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.29;
Скачать: CL | DM;

Вниз

Dll + Строки + Delphi + VB   Найти похожие ветки 

 
XopoSHiy   (2003-05-17 15:57) [0]

Необходимо сделать DLL-ку, которая в последствии будет использоваться в Delphi и Visual Basic-е
В dll-ке процедурка возвращающая строку. Размер строки заранее неизвестен естественно. Она может быть большая.

Если выделять память в dll-ке, то ее никак потом не освободить...

Если написать так

procedure myProc(buffer : PChar; size : Integer; var actualSize : Integer);

а в главной программе на Дельфи так, например

var
Buffer : PChar;
begin
....
GetMem(Buffer, 1000);
myProc(Buffer, 1000, size);
.....
FreeMem(Buffer, 1000);
end;


Тогда встает вопрос, а как ЭТИМ пользоваться в VB?
А точнее, как избежать утечки памяти в VB?

Или может как-то по другому можно функцию объявить?


 
Тих   (2003-05-17 19:05) [1]

Сразу двух зайцев - написать COM-сервер.


 
icWasya ©   (2003-05-19 10:28) [2]

в DLL
var StrResult:String; // это строка - результат
function myProc(buffer : PChar; size : Integer) : Integer; stdcall;
var P:PChar;
begin
if buffer = nil then begin
Result:=Length(StrResult);
end else begin
strncpy(buffer, pChar(StrResult), size);
Result:=strlen(buffer);
end;
end;



в Basic

declare function myProc lib "myDLL" (ByVal buffer As String, ByVal size As Long ) As Long

declare function myProcLen lib "myDLL" alias "myProc" As Long


Dim buf As String
Dim L As Long

L = myProcLen

Buf = Space(L)

MyProc(Buf,L)



а в главной программе на Дельфи так, например


var
Buffer : PChar;
L :Integer;
begin
....
L:=myProc(Nil,0);

GetMem(Buffer, L);
myProc(Buffer, L);
.....
FreeMem(Buffer, L);
end;


или так, например


var
Buffer : String;
L :Integer;
begin
....
L:=myProc(Nil,0);

SetLength(Buffer, L);
myProc(PChar(Buffer), L);
.....
end;


 
Bug   (2003-05-19 10:39) [3]

Используй для парамеьров тип OleVariant он есть и в VB.


 
Ihor Osov'yak ©   (2003-05-19 10:39) [4]

1. Кто память выделяет, тот освобождает. Отсюда вывод - вызывающая сторона
2. Чтобы избежать лишних приключений - или PChar, или WideString
3. Для случая PChar в dll передаем указатель на выделеный буфер и макс. размер буфера. Dll возвращает число реально использованых байт или число, которое нужно (если буфера нехватает). Тогда вызывающая сторона может повтроить вызов с большим буфером. Часто практикуют передачу nil c размером 0 с целью запроса нужного размера буффера - обычная практика в winapi..

Ну и о stdcall помнить..




 
nikkie ©   (2003-05-19 10:40) [5]

>Если выделять память в dll-ке, то ее никак потом не освободить...
написать процедуру в dll для освобождения


 
evvcom ©   (2003-05-19 12:29) [6]


> nikkie © (19.05.03 10:40)
> >Если выделять память в dll-ке, то ее никак потом не освободить...
> написать процедуру в dll для освобождения

Или использовать WinAPI функции Heap*


 
XopoSHiy   (2003-05-19 14:44) [7]

Всем Thanx конечно...
Но, тут еще парочка проблем возникла...
Короче будет ActiveX-компонентик вместо функции! Так и проще и удобнее в моем случае оказалось.



Страницы: 1 вся ветка

Текущий архив: 2003.05.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
7-95137
Konstantionov
2003-03-31 12:18
2003.05.29
Работа с реестром


3-94681
victor_ch
2003-05-01 11:26
2003.05.29
Как прервать запрос запущенный в отдельном потоке


4-95164
LyzD
2003-03-30 17:01
2003.05.29
Добавить свою кнопку в заголовок окна...


14-95041
Шоломицкий
2003-05-05 17:46
2003.05.29
Плохо мне очень....(((((


3-94751
Robber
2003-05-11 13:44
2003.05.29
Вопрос! Как упаковать БД в Delphi?