用delphi写的动态库,在delphi中调用结果正常,但在word(vba)中调用结果不正确,请大家来看看,是哪里写得不对!(100分)

  • 主题发起人 主题发起人 dirk
  • 开始时间 开始时间
xusong168,我上面已经说过,我试过TBitmap的,你一再追问我“你到底试过没有?”,唉,看了下面的代码你该不会再这么问了吧(下面的代码在VBA中运行的结果和上面的没什么不同)?<br><br>我最早就是用TBitmap的,有问题,就用TImage了,这样的代码在delphi中调用没有问题的,但在VBA中,在Canvas上的操作似乎根本就没有用。<br><br>&nbsp; &nbsp; img_bj: TBitmap;//TImage;<br>&nbsp; &nbsp; img_wz: TBitmap;//TImage;<br>&nbsp; &nbsp; img_qj: TBitmap;//TImage;<br>function LoadQJ(PicName: PChar;X,Y:integer): boolean; stdcall;<br>begin<br>&nbsp; &nbsp; img_qj.Free ;<br>&nbsp; &nbsp; img_qj:=TBitmap.Create;// TImage.Create(nil);<br>// &nbsp; &nbsp;img_qj.AutoSize :=true;<br>&nbsp; &nbsp; img_qj.LoadFromFile(PicName);<br>&nbsp; &nbsp; bitblt(img_bj.Canvas.Handle ,x,y,img_qj.width,img_qj.height,img_qj.canvas.handle,0,0,SRCCOPY);<br>// &nbsp; &nbsp;img_bj.Canvas.Draw(X ,Y ,img_qj.Canvas );<br>&nbsp; &nbsp; Result :=true;<br>end;<br><br>function LoadText(Text,FontName: PChar;X,Y:integer;FontColor:integer=0;FontSize:integer=9;<br>&nbsp; FontBold:boolean=false;FontItalic:boolean=false;FontUnderline:boolean=false): boolean; stdcall;<br>begin<br>&nbsp; &nbsp; img_bj.Canvas.Font.Name :=FontName;<br>&nbsp; &nbsp; img_bj.Canvas.Font.Size :=FontSize;<br>&nbsp; &nbsp; img_bj.Canvas.Font.Color :=FontColor;<br>&nbsp; &nbsp; img_bj.Canvas.Font.Style :=[];<br>&nbsp; &nbsp; if FontBold then img_bj.Canvas.Font.Style :=img_bj.Canvas.Font.Style +[fsBold];<br>&nbsp; &nbsp; if FontItalic then img_bj.Canvas.Font.Style :=img_bj.Canvas.Font.Style +[fsItalic];<br>&nbsp; &nbsp; if FontUnderline then img_bj.Canvas.Font.Style :=img_bj.Canvas.Font.Style +[fsUnderline];<br>&nbsp; &nbsp; img_bj.Canvas.TextOut(0,0,Text);<br>&nbsp; &nbsp; Result :=true;<br>end;<br>bitblt、和TextOut都不起作用。<br><br>&gt;TImage不行,因为它需要一个Windows DC,也就是说,它必须放在一个Form上才有效,<br>在dll中的Form没正常显示出来的情况下,就不行了。 &nbsp;<br><br>这点是不成立的,这是我上面的一段描述:<br>“[red]在delphi中图片、文字完全可以合成,产生新的图片文件,但是在word中调用,只能把背景图保存出来,但前景图、文字却不能画到背景图上去,[/red]”<br>背景图保存出来了,怎么会没有DC呢?<br><br>嗯,你所说的试过没有?如果你还是觉得TBitmap一定能回答这个问题,那么贴出代码,我调试出来就OK。
 
&gt;是真正的标准动态库!不过要传递参数就有问题,对于pchar这种参数,必须要在<br>delphi dll project中加入shmem这个单元的引用!<br><br>我知道delphi出来的是标准动态库,我只是对同样的动态库,在不同的编程语言中出来的结果不同感到奇怪,不过对于你后面所说就不敢苟同了:<br>{ Important note about DLL memory management: ShareMem must be the<br>&nbsp; first unit in your library's USES clause AND your project's (select<br>&nbsp; Project-View Source) USES clause if your DLL exports any procedures or<br>&nbsp; functions that pass strings as parameters or function results. This<br>&nbsp; applies to all strings passed to and from your DLL--even those that<br>&nbsp; are nested in records and classes. ShareMem is the interface unit to<br>&nbsp; the BORLNDMM.DLL shared memory manager, which must be deployed along<br>&nbsp; with your DLL. To avoid using BORLNDMM.DLL, pass string information<br>&nbsp; using PChar or ShortString parameters. }<br>每个dll工程都有这么一段,其中所说和你对pchar的说法正好相反,如果你在dll的参数、返回值中使用string类型,则必须使用sharemem,这样发布时要带上BORLNDMM.DLL,如果你不想发布BORLNDMM.DLL,为了避免(avoid)使用BORLNDMM.DLL,应该使用PChar或者ShortString类型。<br><br>不过,你前面的一个建议到是不错,导出个无参数的过程试试,我试了下,果然是参数的问题,没有参数,ok。<br><br>可能是VBA中申明API部分的问题,没有写对调用方式。
 
果然是参数传递的问题
 
boolean要換成LongBool
 
后退
顶部