dll是用Delphi7.0写的一个COM组件。用VB.NET调用是出现了堆损坏的异常。但能返回正确的结果。
代码如下
procedure TMyComObj.GetText(Dir,FileNameCol : PWideChar);
var s : string;
ss : Widestring;
i ,Len : integer;
p : ^Widestring;
begin
s := XXXXX(Dir); //XXXXX是个返回字符串的函数
ss := s;
Len := length(ss);
p := Pointer(FileNameCol);
for i :=1 to Len do
begin
p^ := ss[i];
Inc(p)
end;
end;
在VB.NET先给FileNameCol预分配了一兆空间
做了如下处理
FileNameCol=“aa”
for i=1 to 19
FileNameCol=FileNameCol & FileNameCol
next
procedure TMyComObj.FreeMemory(Len : LongWord);
begin
FreeMem(Ps,2*Len)
end;
对 GetText(Dir,FileNameCol : PWideChar)方法作如下修改:
procedure TMyComObj.GetText(Dir,FileNameCol : PWideChar);
var s : string;
ss : Widestring;
i ,Len : integer;
p,pa,pb : ^Widestring;
begin
s := XXXXX(Dir); //XXXXX是个返回字符串的函数
ss := s;
Len := length(ss);
p := Pointer(FileNameCol);
pa := Pointer(Ps);
pb := pa;
//下面这段代码是将ss逐字符写到Ps指向的内存块中(通过ALLocaMemory为Ps分配内存)
for i :=1 to Len do
begin
pa^ := ss[i];
Inc(pa)
end;
//下面这段代码是将Ps指向的内存块中内容复制到FileNameCol
for i :=1 to Len do
begin
p^ := pb^;
Inc(pb);
Inc(pb);
end;
end;
不知道行不行
Dim slp As Double = 1000 '决定休眠时间。
Dim temp1 As Screen = My.Computer.Screen
Dim a As New Bitmap(temp1.WorkingArea.Size.Width, temp1.WorkingArea.Size.Height)
Dim aaa As Graphics = Graphics.FromHdc(GetWindowDC(GetDesktopWindow()))
Dim aaab As Graphics = Graphics.FromImage(a)
Dim sa As New Point(0, 0)
Do
Try
slp -= 0.5
If slp <= 0 Then
slp = 1
End If
aaab.FastCopySreen()
Dim Hicon As IntPtr = a.GetHicon()
aaa.DrawIcon(Icon.FromHandle(Hicon), New Rectangle With {
.Width = temp1.WorkingArea.Width * 0.9,
.Height = temp1.WorkingArea.Height * 0.9,
.X = temp1.WorkingArea.Width * 0.05,
.Y = temp1.WorkingArea.Height * 0.05
})
Threading.Thread.Sleep(slp)
aaab.Dispose()
a.Dispose()
a = New Bitmap(temp1.WorkingArea.Size.Width, temp1.WorkingArea.Size.Height)
aaab = Graphics.FromImage(a)
Catch
aaa.Dispose()
aaab.Dispose()
a.Dispose()
Threading.Thread.Sleep(10000)
GoTo To2DWorld
End Try
Loop