C调用delphi的DLL,C的调用格式为:int ocr(char *in,char *out)。//第一个指向图像的首地址,我的程序可以读取了。第二个是c分配字符串内存指针,需要我的delphi修改后传回给C的数值?关键这个delphi如何来写?
我用delphi写的程序:
Function OCR (In1:Pointer;out1:Pointer):integer; stdcall ;
var
Image: TBITMAP;
bitmapMem: TMemoryStream;
F:string;
begin
bitmapMem:= TMemoryStream.Create;
try
bitmapMem.WriteBuffer(In1^,5454);//读取图片,5454为图片大小
bitmapMem.Position:=0;
Image:=TBITMAP.Create;
try
Image.LoadFromStream(bitmapMem);
F:=BitToAry(Image);//图片转换字符串赋值到F变量
bitmapMem.Free;
out1^:=F;//出错信息为: E2015 Operator not applicable to this operand type?
//如果把OCR (In1:Pointer;out1:Pchar)然后out1^:=F; 出错信息为:E2010 Incompatible types: 'Char' and 'PWideChar'?
Result:=1;
finally
Image.free;
end;
except
Result:=0;
end;
上面的这条delphi语句应该怎么写啊?
我用delphi写的程序:
Function OCR (In1:Pointer;out1:Pointer):integer; stdcall ;
var
Image: TBITMAP;
bitmapMem: TMemoryStream;
F:string;
begin
bitmapMem:= TMemoryStream.Create;
try
bitmapMem.WriteBuffer(In1^,5454);//读取图片,5454为图片大小
bitmapMem.Position:=0;
Image:=TBITMAP.Create;
try
Image.LoadFromStream(bitmapMem);
F:=BitToAry(Image);//图片转换字符串赋值到F变量
bitmapMem.Free;
out1^:=F;//出错信息为: E2015 Operator not applicable to this operand type?
//如果把OCR (In1:Pointer;out1:Pchar)然后out1^:=F; 出错信息为:E2010 Incompatible types: 'Char' and 'PWideChar'?
Result:=1;
finally
Image.free;
end;
except
Result:=0;
end;
上面的这条delphi语句应该怎么写啊?
var
Image: TBITMAP;
bitmapMem: TMemoryStream;
F:ansistring;
begin
bitmapMem:= TMemoryStream.Create;
try
bitmapMem.WriteBuffer(In1^,5454);//读取图片,5454为图片大小
bitmapMem.Position:=0;
Image:=TBITMAP.Create;
try
Image.LoadFromStream(bitmapMem);
F:=BitToAry(Image);//图片转换字符串赋值到F变量
bitmapMem.Free;
//out1^:=F;
move(PAnsiChar(F)^,out1,Length(F));
Result:=1;
finally
Image.free;
end;
except
Result:=0;
end;
必須把F中的字符拿回家裏,做妾才行。 不然放在別的地方不保險,回跑了。哈哈。 開個玩笑
move(PAnsiChar(F)^,out1^,Length(F));
其中还需要调用程序主动为out1分配足够的内存,即大于等于Length(F)
{$IFDEF PUREPASCAL}
var
S, D: PAnsiChar;
I: Integer;
begin
S := PAnsiChar(@Source);
D := PAnsiChar(@Dest);
if S = D then Exit;
if Cardinal(D) > Cardinal(S) then
for I := count-1 downto 0 do
D[I] := S[I]
else
for I := 0 to count-1 do
D[I] := S[I];
end; 如果目票空間不足,好像就會這樣處理掉了