用PB调用Delphi写的Dll函数声明问题! (50分)

  • 主题发起人 主题发起人 阿拉宁波人
  • 开始时间 开始时间

阿拉宁波人

Unregistered / Unconfirmed
GUEST, unregistred user!
我用Delphi写的一个Dll,如下:<br><br>function AAA(KK: Word; var Buffer; Length: LongInt): Word;<br>function BBB(FileName: PChar; var HHH: Word): Boolean;<br><br>想在PB中调用,请问这个函数的声明,怎么写?
 
注意一点,在delphi中,所有的函数名、变量名一律小写,会减少很多麻烦。
 
还有一点,用stdcall
 
在Delphi中的调用我当然知道了!
 
举个例子:function integer myinstr(string ls_string,char ls_char) library 'photo.dll'<br>不必要指明'photo.dll'的详细目录。你试一试吧!
 
不是叫你在delphi中调用,而是叫你在delphi中声明!这类问题50%的问题出在delphi的声明上!<br>如果你的声明如你的题目中写的一样,一辈子也别想在pb中调用。pb的调用声明旧那个样子,<br>你的适应它。
 
dll我已写好了,可以在delphi中调用!
 
可以在delphi中调用不能说明一定可以在pb中调用,pb是解释型语言,它有他自己的调用逻辑。<br>把你的声明贴出来,我帮你看看吧。<br>
 
因为不会写声明才来问的.
 
你的意思我明白了,想要delphi和pb的源代码。我写过和你的bbb一样的dll,以及pb调用的代码,<br>不过找起来稍费点事,所以我想把要点告诉你:关键是delphi dll中的声明,声明好了以后<br>,略有水平的pb程序员,只要会调windows api,就会调dll了。而在delphi中的要点,在一开<br>始就告诉你了。如果你认为我能解决你的问题,请把你在delphi 写的dll中对bbb函数的声明<br>写出来,我帮你改。否则等过了年,如果你还需要的话,我再给你找我的代码贴给你吧。<br>宁波人说话是不是总要加惊叹号啊?
 
sorry,我在上面写的是如何在pb中调用delphi创建的dll.
 
如果不改动DLL的声明好像比较麻烦。PB对参数处理和Delphi不一样,如果一定要调用的话<br>需要写一个函数负责处理参数。
 
谢谢HanFeng,tseug:<br>Delphi中的Dll声明如下:<br>const<br>&nbsp; DLL_NAME = 'PPP.DLL';<br><br>function AAA(KKK: Word; var Buffer; Length: LongInt): Word; stdcall; external DLL_FILENAME;<br>function BBB(FileName: PChar; var HHH: LongWord): Boolean; stdcall; external DLL_FILENAME;<br><br>
 
FUNCTION Integer AAA(Integer KKK, REF String Buffer, Long Length) library 'PPP.DLL'<br><br>法一:有返回值的函数<br><br>&nbsp; &nbsp; { access } FUNCTION returndatatype name ( { { REF } datatype1 arg1, &nbsp; &nbsp; ..., { REF } datatypen argn } ) &nbsp; &nbsp; &nbsp; &nbsp; LIBRARY "libname" &nbsp; &nbsp; ALIAS FOR "extname"<br>语法二:无返回值的函数<br><br>&nbsp; &nbsp; &nbsp; &nbsp; { access } SUBROUTINE name ( { { REF } datatype1 arg1, ..., &nbsp; &nbsp;{ REF } datatypen argn} ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LIBRARY "libname" &nbsp; &nbsp; ALIAS FOR "extname"<br><br>参数的传递:<br><br>&nbsp; &nbsp; 通过值传递的语法: &nbsp; &nbsp;ParameterDataType Parameter<br>&nbsp; &nbsp; 通过引用传递的语法: &nbsp;REF ParameterDataType Parameter<br><br>实例:<br><br>&nbsp; &nbsp; 取得用户名:<br>&nbsp; &nbsp; &nbsp; &nbsp; FUNCTION BOOLEAN GetUserNameA(REF STRING uName,REF ULONG sLength) &amp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LIBRARY "advapi32.DLL"<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; STRING UserName,sLength<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sLength = 255<br>&nbsp; &nbsp; &nbsp; &nbsp; UserName = SPACE(255) //分配空间<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GetUserNameA(UserName,sLength)<br><br>&nbsp; &nbsp; &nbsp; &nbsp; 动态触发键盘的键值(本例为TAB):<br>&nbsp; &nbsp; &nbsp; &nbsp; #DEFINE TABKeyCode &nbsp;7<br>&nbsp; &nbsp; &nbsp; &nbsp; SUBROUTINE Keybd_Event(INT bVk,INT bScan,INT dwFlags,INT dwExtraInfo) &amp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LIBRARY "user32.dll"<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Keybd_Event(TABKeyCode,0,0,0) //按下TAB<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Keybd_Event(TABKeyCode,0,2,0) //放开TAB<br><br>
 
说了半天,我发现可能是我表述的不清楚,动态连接库是不是你写的?有没有源码?<br>我说的是dll源码中的声明。这样吧,我找到我的代码了,给你贴出来吧。<br>delphi 写的动态连接库subpicure.dll源码的声明:<br>//注意:下面的声明中,函数名和变量都是小写,这非常重要!如果你没有源代码,必须<br>//对他进行二次包装。bool最好转成integer,强制类型转换最好在dll内部进行。<br>function subpic(srcpicname:pchar;dstpicname:pchar;top,left,width,height:integer):integer;stdcall ;export;<br><br>pb调用代码的声明:<br>FUNCTION long subpic (string srcpicname, string dstpicname, long top,long left,long width,long height) &nbsp;LIBRARY &nbsp;"subpicure.dll"<br>按照以上原则,你在delphi写的ppp.dll中的源代码应当有如下声明:<br>function bbb(filename: PChar; var hhh: integer): integer; stdcall; external <br><br>pb中调用代码应当如下声明:<br>FUNCTION long bbb(string filename, hhh height) &nbsp;LIBRARY &nbsp;"ppp.dll"<br><br>你先试试看,先调bbb.<br>
 
动态调用!<br>在PB中应该可以使用LoadLibrary的吧
 
Hello,关于你问我的问题用Print system打印dxgrid动态数据集的答案在这里,你去看看吧<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=695113<br>就是英文的那一大段。<br>&nbsp; &nbsp; &nbsp; doxpix@yeah.net<br>
 
哈,我又把你的邮件地址忘了。<br>实际上很简单,在query控件open之后,用dxdbgrid1.CreateDefaultColumns<br>创建缺省列(可用clearcolumns(dxdbgrid1)清除以前创建的列。)<br>然后在打印(或打印预览)之前设置OptionsDB属性,就像这样——<br>&nbsp; with dxdbgrid1 do<br>&nbsp; begin<br>&nbsp; &nbsp; OptionsDB := OptionsDB + [edgoLoadAllRecords];<br>&nbsp; &nbsp; OptionsDB := OptionsDB - [edgoCanNavigation];<br>&nbsp; end;<br><br>&nbsp; with mainfrm do<br>&nbsp; begin<br>&nbsp; &nbsp; dxgridlnk.component:=dxdbgrid1;<br>&nbsp; &nbsp; dxCPmain.Print(true,nil,dxgridlnk);<br>&nbsp; end;<br><br>&nbsp; with dxdbgrid1 do<br>&nbsp; begin<br>&nbsp; &nbsp; OptionsDB := OptionsDB - [edgoLoadAllRecords];<br>&nbsp; &nbsp; OptionsDB := OptionsDB + [edgoCanNavigation];<br>&nbsp; end;
 
多人接受答案了。
 
后退
顶部