首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > PB >

DELPI7编写的动态库,在PB中怎么声明

2012-02-09 
DELPI7编写的动态库,在PB中如何声明DELPI7中test.dll中的函数如下:function gf_jmword(as_string: ShortSt

DELPI7编写的动态库,在PB中如何声明
DELPI7中 test.dll中的函数如下:
  function gf_jmword(as_string: ShortString): wideString; stdcall;
  functiongf_word(ac_word: pchar; ac_ts: integer): wideString; stdcall;


上边两个函数想在PB中调用,在PB中如何声明这连个函数,请各位指教。




[解决办法]
看不懂你的类型.

你下个PB的API大全,看看就知道了.




API调用规范及方法













(独孤求败二零零四年一月二十六日整理于深圳市南山区)



外部函数就是用其他语言编写并储存在动态链接库里面的函数。这些动态链接库可以存放多个外部函数,外部函数可以是用VC++、Delphi等其他编程语言编写的。但是无论用什么语言编写,它都要符合基本的原则,就是必须用Pascal(16位)或标准(32位)调用规则编写,否则在PB中将无法调用。
PB中调用外部函数的语法是:
{access} FUNCTION returndatatype FunctionName ( { { REF} datatype1 arg1, …, {REF} datatypen argn}) LIBRARY “libname” ALLAS FOR “extname”
或:{access} SUBROUTINE SubroutineName ( { {REF} datatype1 arg1, … ,{REF} datatypen argn }) 
LIBRARY “libname” ALLAS FOR “extname”
由于编写语言的不同,所以肯定会有数据类型不匹配的问题,下表列出了C++和PB数据类型的转换对应关系:
C++数据类型PB数据类型
Byte,CharChar
BoolBoolean
CharBlob
Char*String Ref
DoubleDouble
DwordUlong
FloatReal
HandleUint
HwndUlong
IntInteger
LongLong
LpbyteString Ref
LpdwordUlong
LpintInteger
LplongLong
LpstrString Ref
LpviodString
LpwordUint
Ulong/unsigned longUlong
Unsigned int/Unsigned Short/WordUint


[解决办法]
拷贝一些调用方法,你参考:
FUNCTION ulong AbortDoc(ulong hdc) LIBRARY "gdi32.dll"
FUNCTION ulong AbortPath(ulong hdc) LIBRARY "gdi32.dll"
FUNCTION ulong AbortPrinter(ulong hPrinter) LIBRARY "winspool.drv"
FUNCTION ulong AbortSystemShutdown(ref string lpMachineName) LIBRARY "advapi32.dll" ALIAS FOR "AbortSystemShutdownA"
FUNCTION ulong AccessCheck(ref SECURITY_DESCRIPTOR pSecurityDescriptor,ulong ClientToken,ulong DesiredAccess,ref GENERIC_MAPPING GenericMapping,ref PRIVILEGE_SET PrivilegeSet,ref ulong PrivilegeSetLength,ref ulong GrantedAccess,ulong Status) LIBRARY "advapi32.dll"
FUNCTION ulong AccessCheckAndAuditAlarm(ref string SubsystemName,ref Any HandleId,ref string ObjectTypeName,ref string ObjectName,ref SECURITY_DESCRIPTOR SecurityDescriptor,ulong DesiredAccess,ref GENERIC_MAPPING GenericMapping,ulong ObjectCreation,ref ulong GrantedAccess,ulong AccessStatus,ulong pfGenerateOnClose) LIBRARY "advapi32.dll" ALIAS FOR "AccessCheckAndAuditAlarmA"
FUNCTION ulong ActivateKeyboardLayout(ulong HKL,ulong flags) LIBRARY "user32.dll"
FUNCTION ulong AddAccessAllowedAce(ref ACL pAcl,ulong dwAceRevision,ulong AccessMask,ref Any pSid) LIBRARY "advapi32.dll"
FUNCTION ulong AddAccessDeniedAce(ref ACL pAcl,ulong dwAceRevision,ulong AccessMask,ref Any pSid) LIBRARY "advapi32.dll"
FUNCTION ulong AddAce(ref ACL pAcl,ulong dwAceRevision,ulong dwStartingAceIndex,ref Any pAceList,ulong nAceListLength) LIBRARY "advapi32.dll"
FUNCTION Integer AddAtom(ref string lpString) LIBRARY "kernel32.dll" ALIAS FOR "AddAtomA"
FUNCTION ulong AddAuditAccessAce(ref ACL pAcl,ulong dwAceRevision,ulong dwAccessMask,ref Any pSid,ulong bAuditSuccess,ulong bAuditFailure) LIBRARY "advapi32.dll"
FUNCTION ulong AddFontResource(ref string lpFileName) LIBRARY "gdi32.dll" ALIAS FOR "AddFontResourceA"
FUNCTION ulong AddForm(ulong hPrinter,ulong Level,ref Byte pForm) LIBRARY "winspool.drv" ALIAS FOR "AddFormA"
FUNCTION ulong AddJob(ulong hPrinter,ulong Level,ref Byte pData,ulong cdBuf,ref ulong pcbNeeded) LIBRARY "winspool.drv" ALIAS FOR "AddJobA"
FUNCTION ulong AddMonitor(ref string pName,ulong Level,ref Byte pMonitors) LIBRARY "winspool.drv" ALIAS FOR "AddMonitorA"


FUNCTION ulong AddPort(ref string pName,ulong hwnd,ref string pMonitorName) LIBRARY "winspool.drv" ALIAS FOR "AddPortA"
FUNCTION ulong AddPrinter(ref string pName,ulong Level,ref Byte pPrinter) LIBRARY "winspool.drv" ALIAS FOR "AddPrinterA"
FUNCTION ulong AddPrinterConnection(ref string pName) LIBRARY "winspool.drv" ALIAS FOR "AddPrinterConnectionA"
FUNCTION ulong AddPrinterDriver(ref string pName,ulong Level,ref Byte pDriverInfor) LIBRARY "winspool.drv" ALIAS FOR "AddPrinterDriverA"
FUNCTION ulong AddPrintProcessor(ref string pName,ref string pEnvironment,ref string pPathName,ref string pPrintProcessorName) LIBRARY "winspool.drv" ALIAS FOR "AddPrintProcessorA"
FUNCTION ulong AddPrintProvidor(ref string pName,ulong Level,ref Byte pProvidorInfo) LIBRARY "winspool.drv" ALIAS FOR "AddPrintProvidorA"
FUNCTION ulong AdjustTokenGroups(ulong TokenHandle,ulong ResetToDefault,ref TOKEN_GROUPS NewState,ulong BufferLength,ref TOKEN_GROUPS PreviousState,ref ulong ReturnLength) LIBRARY "advapi32.dll"
FUNCTION ulong AdjustTokenPrivileges(ulong TokenHandle,ulong DisableAllPrivileges,ref TOKEN_PRIVILEGES NewState,ulong BufferLength,ref TOKEN_PRIVILEGES PreviousState,ref ulong ReturnLength) LIBRARY "advapi32.dll"
FUNCTION ulong AdjustWindowRect(ref RECT lpRect,ulong dwStyle,ulong bMenu) LIBRARY "user32.dll" ALIAS FOR "AdjustWindowRectA"
FUNCTION ulong AdjustWindowRectEx(ref RECT lpRect,ulong dsStyle,ulong bMenu,ulong dwEsStyle) LIBRARY "user32.dll"
FUNCTION ulong AdvancedDocumentProperties(ulong hwnd,ulong hPrinter,ref string pDeviceName,ref DEVMODE pDevModeOutput,ref DEVMODE pDevModeInput) LIBRARY "winspool.drv" ALIAS FOR "AdvancedDocumentPropertiesA"
FUNCTION ulong AllocateAndInitializeSid(ref SID_IDENTIFIER_AUTHORITY pIdentifierAuthority,Byte nSubAuthorityCount,ulong nSubAuthority0,ulong nSubAuthority1,ulong nSubAuthority2,ulong nSubAuthority3,ulong nSubAuthority4,ulong nSubAuthority5,ulong nSubAuthority6,ulong nSubAuthority7,ref ulong lpPSid) LIBRARY "advapi32.dll"
FUNCTION ulong AllocateLocallyUniqueId(ref LARGE_INTEGER Luid) LIBRARY "advapi32.dll"
FUNCTION ulong AllocConsole() LIBRARY "kernel32.dll"
FUNCTION ulong AngleArc(ulong hdc,ulong x,ulong y,ulong dwRadius,Double eStartAngle,Double eSweepAngle) LIBRARY "gdi32.dll"
FUNCTION ulong AnimatePalette(ulong hPalette,ulong wStartIndex,ulong wNumEntries,ref PALETTEENTRY lpPaletteColors) LIBRARY "gdi32.dll" ALIAS FOR "AnimatePaletteA"
FUNCTION ulong AnyPopup() LIBRARY "user32.dll"
FUNCTION ulong AppendMenu(ulong hMenu,ulong wFlags,ulong wIDNewItem,ref string lpNewItem) LIBRARY "user32.dll" ALIAS FOR "AppendMenuA"
FUNCTION ulong Arc(ulong hdc,ulong X1,ulong Y1,ulong X2,ulong Y2,ulong X3,ulong Y3,ulong X4,ulong Y4) LIBRARY "gdi32.dll"
FUNCTION ulong ArcTo(ulong hdc,ulong X1,ulong Y1,ulong X2,ulong Y2,ulong X3,ulong Y3,ulong X4,ulong Y4) LIBRARY "gdi32.dll"
FUNCTION ulong AreAllAccessesGranted(ulong GrantedAccess,ulong DesiredAccess) LIBRARY "advapi32.dll"
FUNCTION ulong AreAnyAccessesGranted(ulong GrantedAccess,ulong DesiredAccess) LIBRARY "advapi32.dll"
FUNCTION ulong ArrangeIconicWindows(ulong hwnd) LIBRARY "user32.dll"
FUNCTION ulong AttachThreadInput(ulong idAttach,ulong idAttachTo,ulong fAttach) LIBRARY "user32.dll"

[解决办法]
地址引用的时候使用ref方式,就是该变量是传址
[解决办法]
function string gf_jmword(string as_string) library 'test.dll'
function string gf_word(ref string ac_word,long ac_ts) library 'test.dll'
记得这样传进去的话是采用的ansi方式,在delphi中有时候需要转换成unicode的


[解决办法]
delphi的pchar就是传址的,可以用ref string或 ref char xx[255],如果用ref string的话必须在调用前分配内存空间,方式为
x = space(255)
gf_word(x,0)
[解决办法]
参数传递和返回改用PChar,如果用ShortString可以尝试用下面的函数处理下:


//==============================================================================
// 格式化ShortString
// ShortString类型在第一个字节存放字符串长度(所以其最大255),没有Null结束
//------------------------------------------
procedure FormatShortString(var s:ShortString);
var
li_len : integer;
begin
li_len := length(s);
move(s[1],s[0],li_len);
s[li_len] := #0;
end;

热点排行