PB声明DLL问题

2sword 2010-02-06 09:55:23
在C#中声明DLL如下:

[DllImport("IDTDevice.dll",EntryPoint="RF_SendCmd")]
public static extern int RF_SendCmd(byte nCom,int address,byte nCmd,Byte[]aBuf ,byte nDatelen,Byte[] pAck,byte nAckLen);


转成PB是什么样子的啊???
...全文
407 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenshu 2010-02-22
  • 打赏
  • 举报
回复
引用 7 楼 kenshu 的回复:
引用楼主 2sword 的回复:在C#中声明DLL如下:      [DllImport("IDTDevice.dll",EntryPoint="RF_SendCmd")]       public static extern int  RF_SendCmd(byte nCom,int  address,byte nCmd,Byte[]aBuf ,byte nDatelen,Byte[] pAck,byte nAckLen);  转成PB是什么样子的啊???

PB10以下


FUNCTION long RF_SendCmd(char nCom,long address,char nCmd,ref blob aBuf,char nDatelen,ref blob pAck,char nAckLen) LIBRARY "IDTDevice.dll"

--------------------------------------------------------
上面用ref blob,会比ref char []好,因为如果需要传输ASICC为0的字符,也传得了.一般做硬件接口的,都用blob,再在PB中转换.

blob aBuf,pAck

//调用前必须先申请好内存,当然这个接口具体看你硬件商的约定,但字面理解,一个是传进去的值,一个是硬件写进来的,所以要先申请。

aBuf = blob(space(256))
pAck = blob(space(256))

256是因为,后面那个明显是告诉DLL,你事先有多少存.(除非它是故意干扰我们的),它最大是255,多一点没所谓.

------------------------
PB10+,CHAR的部份可以用BYTE,DLL那里要加ansi;//请楼下接,我这里没有PB,我不会盲打,怕记错了。


另外,那个(n...Len,我不知道哪一个是接收的,要你自己看接口)的参数,最多只能用 char(255),不能用 char(256),那它就等于0了.
pcwe2002 2010-02-22
  • 打赏
  • 举报
回复
funtion int RF_SendCmd(char nCom,int address,char nCmd,char aBuf[] ,int nDatelen,char pAck[],int nAckLen);
kenshu 2010-02-22
  • 打赏
  • 举报
回复
引用 7 楼 kenshu 的回复:
引用楼主 2sword 的回复:在C#中声明DLL如下:      [DllImport("IDTDevice.dll",EntryPoint="RF_SendCmd")]       public static extern int  RF_SendCmd(byte nCom,int  address,byte nCmd,Byte[]aBuf ,byte nDatelen,Byte[] pAck,byte nAckLen);  转成PB是什么样子的啊???

PB10以下


FUNCTION long RF_SendCmd(char nCom,long address,char nCmd,ref blob aBuf,char nDatelen,ref blob pAck,char nAckLen) LIBRARY "IDTDevice.dll"

--------------------------------------------------------
上面用ref blob,会比ref char []好,因为如果需要传输ASICC为0的字符,也传得了.一般做硬件接口的,都用blob,再在PB中转换.

blob aBuf,pAck

//调用前必须先申请好内存,当然这个接口具体看你硬件商的约定,但字面理解,一个是传进去的值,一个是硬件写进来的,所以要先申请。

aBuf = blob(space(256))
pAck = blob(space(256))

256是因为,后面那个明显是告诉DLL,你事先有多少存.(除非它是故意干扰我们的),它最大是255,多一点没所谓.

------------------------
PB10+,CHAR的部份可以用BYTE,DLL那里要加ansi;//请楼下接,我这里没有PB,我不会盲打,怕记错了。


“它最大是255”最大是255,是因为后面那个标记长度的为byte.
kenshu 2010-02-22
  • 打赏
  • 举报
回复
引用楼主 2sword 的回复:
在C#中声明DLL如下:     

[DllImport("IDTDevice.dll",EntryPoint="RF_SendCmd")]
      public static extern int  RF_SendCmd(byte nCom,int  address,byte nCmd,Byte[]aBuf ,byte nDatelen,Byte[] pAck,byte nAckLen); 


转成PB是什么样子的啊???


PB10以下


FUNCTION long RF_SendCmd(char nCom,long address,char nCmd,ref blob aBuf,char nDatelen,ref blob pAck,char nAckLen) LIBRARY "IDTDevice.dll"

--------------------------------------------------------
上面用ref blob,会比ref char []好,因为如果需要传输ASICC为0的字符,也传得了.一般做硬件接口的,都用blob,再在PB中转换.

blob aBuf,pAck

//调用前必须先申请好内存,当然这个接口具体看你硬件商的约定,但字面理解,一个是传进去的值,一个是硬件写进来的,所以要先申请。

aBuf = blob(space(256))
pAck = blob(space(256))

256是因为,后面那个明显是告诉DLL,你事先有多少存.(除非它是故意干扰我们的),它最大是255,多一点没所谓.

------------------------
PB10+,CHAR的部份可以用BYTE,DLL那里要加ansi;//请楼下接,我这里没有PB,我不会盲打,怕记错了。
luoqin 2010-02-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 2sword 的回复:]
是按这样的数据类型转的,但是,这个里面有个数组,一调用就报错。
[/Quote]
不要用动态数组,如果要用的话也要初始一个可能出现的最大值的元素个数,试着改为 char aBuf[255]试试;
31737951 2010-02-07
  • 打赏
  • 举报
回复
数组 要设置初试大小 动态库用的数据大于 你传进去的初始值就溢出
2sword 2010-02-06
  • 打赏
  • 举报
回复
是按这样的数据类型转的,但是,这个里面有个数组,一调用就报错。
pb8 2010-02-06
  • 打赏
  • 举报
回复
数据类型转换表

MICROSOFT PB(16Bit) PB(32Bit)
Bool Boolean Boolean
Byte, Char Char Char
Char* Ref string Ref String
Colorref Uint Ulong
Double Double Double
Dword Uint Ulong
Float N/A N/A
Handle Uint Ulong
Hdc Uint Ulong
Hfile Uint Ulong
Hinstance Uint Ulong
Hwnd Uint Ulong
Int Int Int
Long Long Long
Lparam Uint Ulong
Lpbyte Ref Int Ref Long
Lpcwstr Ref Blob Ref Blob (Unicode use ToUnicode())
Lpcvoid Ref String Ref String
Lpdword Ref Uint Ref Ulong
Lpfiletime Ref Time Ref Time
Lpint Ref Int Ref Long
Lpstr,Lpcstr Ref String Ref String
Lpvoid Ref Structstruct_inst Ref Struct struct_inst
Lpword Ref Int Ref Ulong
Mcierror Long Long
Pbyte Ref Int[#] Ref Long[#]
Short Int Int
Structure Ref Struct struct_inst Ref Struct Struct_inst
Uint Uint Uint
Void** SUBROUTINE SUBROUTINE
Word Int Long
Wparam Uint Ulong

byte对应于char,有时也可以用int,如果用int的话也即对应asc的char,反之亦然;
对应上面的规则改一下就好了~~

680

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder API 调用
社区管理员
  • API 调用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧