![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
dll без менеджера памяти для передачи строк
Gu © (2012-01-05 11:18:00)Если у кого есть время, проверьте плз, небольшую программку:
Дано:
1. dll, в ней юнит
unit DllUnit; interface
uses windows, sysutils;
Procedure GuPrcA(var p:PAnsiChar;const l:integer); StdCall;
Procedure GuPrcW(var p:PWideChar;const l:integer); StdCall;
Exports GuPrcA,GuPrcW;
implementation
procedure GuMes(s:string);
begin
MessageBox(0,pchar(s),'From dll',mb_iconinformation);
end;
Procedure GuPrcW(var p:PWideChar;const l:integer); // wide
var s:widestring;
begin
if (p=nil)or(l<1) then begin p:=nil;exit;end;
SetLength(s,trunc(l/sizeof(widechar)));Move(p^,Pointer(s)^,l);
gumes('l: '+inttostr(l)+', nl: '+inttostr(length(s))+#10+'-'+s+'-');
s:=widestring(Uppercase(s));Move(Pointer(s)^,p^,l);
end;
Procedure GuPrcA(var p:Pansichar;const l:integer); // ansi
var s:ansistring;
begin
if (p=nil)or(l<1) then begin p:=nil;exit;end;
SetLength(s,l);Move(p^,Pointer(s)^,l);
gumes('l: '+inttostr(l)+', nl: '+inttostr(length(s))+#10+'-'+s+'-');
s:=ansistring(AnsiUppercase(s));Move(Pointer(s)^,p^,l);
end;
Initialization
ReportMemoryLeaksOnShutdown:=true;
end.
2. Прога, на окне мемо и 2 кнопки
...
implementation
{$R *.dfm}
Procedure GuPrcA(var p:PansiChar;const l:cardinal); StdCall; external 'mydll.dll' name 'GuPrcA';
Procedure GuPrcW(var p:PwideChar;const l:cardinal); StdCall; external 'mydll.dll' name 'GuPrcW';
procedure TForm1.Button6Click(Sender: TObject);
var p:pwidechar;c:cardinal;s:widestring;
begin
s:=widestring(memo1.Text);
c:=length(s)*sizeof(widechar);
p:=allocmem(c);
Move(Pointer(s)^,p^,c);
GuPrcW(p,c);
s:='';setlength(s,trunc(c/sizeof(widechar)));
Move(p^,Pointer(s)^,c);
Freemem(p,c);
memo1.Text:='='+s+'= l:'+inttostr(c);
end;
procedure TForm1.Button7Click(Sender: TObject);
var p:pansichar;c:cardinal;s:ansistring;
begin
s:=ansistring(memo1.text);
c:=length(s);
p:=allocmem(c);
Move(Pointer(s)^,p^,c);
GuPrcA(p,c);
s:='';setlength(s,c);
Move(p^,Pointer(s)^,c);
Freemem(p,c);
memo1.Text:='='+s+'= l:'+inttostr(c);
end;
Initialization
ReportMemoryLeaksOnShutdown:=true;
end.
исходник обоих (много зеркал): http://www.multiupload.com/WSZKF8IGP1
при нажатии на кнопки происходит передача в длл строки (ansi или wide), отображение ее в msgbox dll, обработка ее там (простой uppercase) и возврат в программу. Менеджер памяти не используется. И в проге и в dll включены ReportMemoryLeaksOnShutdown (отображение событий о потерях памяти), которые оба молчат, т.е. вроде бы все работает и длины строк тоже везде совпадают.
Что надо:
1. Посмотреть, нет ли там ошибок
2. Нельзя ли что-то оптимизировать или может есть какой способ лучше
Спасибо
Dimka Maslov (2012-01-05 11:56:00) [21]Бред написан. Полный бред. Так делать нельзя. Тут 95% лишнего кода.
Gu (2012-01-05 11:45:00) [22]так это.. без выделений памяти под p будут потери памяти. напишите пример, как лучше
RWolf (2012-01-05 11:25:00) [23]> trunc(l/sizeof(widechar))
В паскале это пишется так: l div sizeof(widechar).
Нельзя ли что-то оптимизировать
В программе неоправданно много ручных выделений/освобождений динамической памяти. Рекомендуется уменьшить до нуля.
Gu (2012-01-05 11:23:00) [24]Delphi Xe, забыл написать