Главная страница
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.012 c
1-94835
qwerty2
2003-05-19 18:28
2003.05.29
DCOM


1-94909
prof
2003-05-17 11:54
2003.05.29
копирование файлов


3-94678
Raduga
2003-05-12 19:41
2003.05.29
TADOQuery и память


9-94652
Эдуард
2002-12-17 05:11
2003.05.29
Программирование вращения


1-94946
Fenix_
2003-05-17 03:26
2003.05.29
байт знака числа