Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.011 c
14-95108
NetBreaker666
2003-05-07 12:37
2003.05.29
Моё FAQ :)


1-94915
mdk
2003-05-16 22:39
2003.05.29
как мне %x заменить на переменную x в строке?


14-95116
StarCon
2003-05-08 11:28
2003.05.29
Редактируемый DBGrid


4-95171
anbezr
2003-04-02 11:50
2003.05.29
запись в HKLM в ХР


1-94929
Shc
2003-05-16 20:25
2003.05.29
Многоязычность




   Наверх