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语句应该怎么写啊?

解决方案 »

  1.   

    Function OCR (In1:Pointer; out1: Pointer):integer; stdcall ; 
    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; 
      

  2.   

    move(PAnsiChar(F)^,out1,Length(F)); 
     必須把F中的字符拿回家裏,做妾才行。 不然放在別的地方不保險,回跑了。哈哈。 開個玩笑
      

  3.   

    抱歉,写错了,应该是
     move(PAnsiChar(F)^,out1^,Length(F));
    其中还需要调用程序主动为out1分配足够的内存,即大于等于Length(F)
      

  4.   

    procedure Move(const Source; var Dest; count : Integer);
    {$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;  如果目票空間不足,好像就會這樣處理掉了 
      

  5.   

    多谢高手指点!正在调试,僵哥给出的代码修改了两处:一、var F:ansistring;二、move(PAnsiChar(F)^,out1^,Length(F));按照此代码修改编译dll出错类型( 'string' to 'AnsiString')。继续修改F:=ansistring(BitToAry(Image))//把string类型修改为ansistring,程序成功通过。但有个问题是为什么不能用string呢?我试过程序改为(var F:string和move(PChar(F)^,out1^,Length(F));)来进行调试并进行汇编的跟踪。发现调用程序只返回了4个数字之中的其中第一个数字1。在out1指针的地址显示为:00370031(.7.1)其中的两个数字,为什么会这样的?解答完马上结贴!谢谢!还有一个问题就是如何在c和delphi之间传递二维数组?具体的实现是C传给delphi的dll程序一个string的字符串,delphi格式化运算后返回一个二维数组给C的主程序?
      

  6.   

    不要随便使用AnsiString,否则在Delphi程序之间使用需要ShareMem,如果跟C程序使用那就没办法使用了。