在DLL里面的函数的参数能用类似于TBitmap的类型吗?
如果不可以,有没有替代的方法?

解决方案 »

  1.   

    可以,不过只能在Delphi中调用。
      

  2.   

    可以
    TO:linzhengqun(风) 
    没用过别的,是不是没有这个类啊?
      

  3.   

    参数没有限制,
    当然了,如果想你的DLL能用各种语言都能调用,
    最好不要用某一种语言中特性的数据类型,
    最好用与C语言兼容的数据类型来开发,如果是复杂的数据,
    最好就定义结构体参数。
      

  4.   

    TBitmap是Delphi的一个类,在别的语言中当然不能用。
      

  5.   

    我是在DELPHI里面调用的,不过程序出错,说什么 Cannot Assign a TBitmap to a TBitmap
    不在DLL里面这个过程就是正确的.好奇怪
      

  6.   

    参看这个:
     procedure DrawBmp(Bmp:TBitmap);stdcall;External 'Project2.dll';
    var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.BitBtn1Click(Sender: TObject);
    var bmp:TBitmap;
    begin
       bmp:=TBitmap.Create;
       bmp.Width:=100;
       bmp.Height:=100;
       try
        DrawBmp(bmp);
        Image1.Picture.Bitmap.Assign(bmp);
       finally
        bmp.Free;
       end;
    end;
    下面的DLL中的实现
    library Project2;
    uses
      SysUtils, Graphics,
      Classes;{$R *.res}
      procedure DrawBmp(Bmp:TBitmap);stdcall;
      begin
         bmp.Canvas.Rectangle(0,0,20,20);
      end;
     exports
        DrawBmp;begin
    end.
      

  7.   

    我是在DELPHI里面调用的,不过程序出错,说什么 Cannot Assign a TBitmap to a TBitmap
    不在DLL里面这个过程就是正确的.好奇怪
       你肯定是先没有实例化先create一下
      

  8.   

    library image;
    uses
      Windows,
      Messages,
      SysUtils,
      Variants,
      Classes,
      Graphics,
      Controls,
      Forms,
      Dialogs,
      ExtCtrls,
      Clipbrd;
    procedure RotateImage90(Bitmap:TBitmap);stdcall;
    var x,y : Integer;
        TmpBitMap : TBitmap;
    begin
      TmpBitMap := TBitmap.Create();
      try
        TmpBitMap.Assign(Bitmap);
        with Bitmap do begin
          Height := TmpBitMap.Width;
          Width := TmpBitMap.Height;
          for x:=0 to Width do
            for y:=0 to Height do
              Canvas.Pixels[TmpBitMap.Height-x,y] := TmpBitMap.Canvas.Pixels[y,x];
          Height := TmpBitMap.Width;
          Width := TmpBitMap.Height;
        end;
      finally
        TmpBitMap.Free;
      end;
    end;exports
    RotateImage90;begin
    end.这就是我的DLL。看不出哪里有错误
      

  9.   

    使用单元的时候这样做:uses
      ShareMem,
      然后是其它的Unit;同样,在你的主程序( xxx.dpr -> view source )中的uses中也一样,加上ShareMem,记住,必须放在第一个位置.
      

  10.   

    procedure RotateImage90(Bitmap:TBitmap);stdcall;
    var
      x,y : Integer;
      Color: TColor;
    begin
        with Bitmap do begin
          for x:=0 to Width do
            for y:=0 to Height do
            begin
              Coloe := Canvas.Pixels[x,y];
              Canvas.Pixels[x,y] := Canvas.Pixels[Height-x,y];
              Canvas.Pixels[Height-x,y] := Color;
            end;
        end;
    end;  楼主的代码改成这样如何?
      

  11.   

    我非圣贤,但见事多怪。楼主,直接操作 Pixel 效率很低,可以一列一列地颠倒,用 CopyRect 做。
      

  12.   

    上面的代码不行哈,错误没有,不过结果不正确。
    用COPYRECT?
    能写出代码吗?
      

  13.   

    我把程序改成了这样
    procedure RotateImage90(Bitmap:TBitmap);stdcall;
    var x,y : Integer;
        TmpBitMap : TBitmap;
    begin
      TmpBitMap := TBitmap.Create();
      try
          with Bitmap do begin
          TmpBitMap.Width:=Bitmap.Width;
          TmpBitMap.Height:=Bitmap.Height;
          for x:=0 to Width do
            for y:=0 to Height do
               TmpBitMap.Canvas.Pixels[x,y]:=Canvas.Pixels[x,y];
        end;
        with Bitmap do begin
          Height := TmpBitMap.Width;
          Width := TmpBitMap.Height;
          for x:=0 to Width do
            for y:=0 to Height do
              Canvas.Pixels[TmpBitMap.Height-x,y] := TmpBitMap.Canvas.Pixels[y,x];
          Height := TmpBitMap.Width;
          Width := TmpBitMap.Height;
        end;
      finally
        TmpBitMap.Free;
      end;
    end;
    以前的错误没有了,运行了正确,不过退出程序时,出现下面的错误,为什么啊?
    Invalid pointer operation
      

  14.   

    呵呵,不好意思,我还一位是楼主要把图象左右颠倒呢。楼主的这段代码没有任何错误,我估计问题出在别的地方,比如一个对象被释放了两次等。
    procedure RotateImage90(Bitmap:TBitmap);stdcall;
    var x,y : Integer;
        TmpBitMap : TBitmap;
    begin
      TmpBitMap := TBitmap.Create();
      try
        with Bitmap do 
        begin
          TmpBitMap.Width  := Width;
          TmpBitMap.Height := Height;
          TmpBitMap.Canvas.CopyRect(Canvas.Handle, 0, 0, Width, Height);
        end;
        with Bitmap do begin
          Height := TmpBitMap.Width;
          Width := TmpBitMap.Height;
          for x:=0 to Width do
            for y:=0 to Height do
              Canvas.Pixels[TmpBitMap.Height-x,y] := TmpBitMap.Canvas.Pixels[y,x];
        end;
      finally
        TmpBitMap.Free;
      end;
    end;