Текущий архив: 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