Delphi Xe。德尔福:DLL没有内存管理器的字符串传输
它给出:
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
通过按按钮有一个传输DLL线(ANSI或宽字符串),其显示在msgbox dll,它的处理(空闲时间大写)并返回到程序。内存管理器不使用(快速 - 简单 - 共享)。在程序和dll中都包含了ReportMemoryLeaksOnShutdown(显示关于内存丢失的事件),它们都是无声的,就像所有的线程都可以工作一样,线路的长度也在任何地方都一致。
是必要:
看,是否有不存在错误(检查上面的错误)
是否有可能优化或提供了一个更好的方式或更容易
是否有可能使用VB或C++/C#中的此类过程来解决此DLL问题?
感谢
如何管理这种编码风格? : -/ – OnTheFly 2012-01-05 09:40:21
这是正常的我可以:) – 2012-01-05 10:47:26
@Gu否你不能。你有一个很大的问题,因为你不缩进你的代码。 – 2012-01-05 10:52:17