jna 调用dll 参数上的返回值怎么获取

HeroesIT 2020-09-29 02:13:52
用java后台调用博思财政软件的dll 库

这是dll文档对应函数的说明
3.4、转入开票数据
说明:根据博思票据预设的需求格式,转入博思开票界面,并可进行打印票据信息。
Function PZrPj
(ZrTxt:PChar;IsPrn:integer; PjLx,Bz,Res:PChar):integer;StdCall;
参数: ZrTxt : 票据数据
(格式详见:数据格式说明.txt 文件)
IsPrn : 0 表示显示转入票据信息后再进行开票
1 表示直接开票并打印
2 表示直接开票但不打印
PjLx : 票据类型
(传空表示取默认当前的票据类型开票,
不为空则指定类型)
Bz : 单据的备注 (可选的参数,可不传则转入无备注)
Res: 只作为存储返回字符
成功:票据类型号,票据号,金额,注册号(以,分格)
错误:(错误信息)
返回值: 参数Res的长度

示例1:var vRes:pChar;
SetLength(vRes,500);
//vRes变量宽度,请定义足够大以返回完整错误信息
PZrPj(SomeString,1,’001001’,’’,vRes)
返回值:25
vRes返回值:’成功:001001,085256,1200.3,闽财2004票’
表示:传入开票内容为SomeString,票据类型为’001001’,
备注为空
返回值:长度为25
开票成功,返回值为 票据类型为001001
票据号为085256
金额为1200.3元
注册号 闽财2004票
示例2:var vRes:pChar;
PZrPj(SomeString,1,’’,’张三’,vRes)
返回值: 31 vRes返回值:’错误:请先上报核销后才能开票据。’
表示: 传入开票内容为SomeString,票据类型为默认值,
备注为’张三’
返回值长度为31
开票不成功,返回值为不成功的错误信息


我在java上是获取不到res返回的值
以下是我实现的步骤
dll 接口
package com.synjones.bosi;

import com.sun.jna.Library;
import com.sun.jna.Native;

public interface BosiAPI extends Library{
BosiAPI insanceDll = Native.loadLibrary("KpJk.dll", BosiAPI.class);
int PConnect();//连接博思开票系统(方式一)
int PLoginSuccess();//判断是否登陆成功
int PZrPj(String ZrTxt,int IsPrn,String PjLx,String Bz,String Res);//转入开票数据

}


测试代码
package com.synjones.bosi;

import com.sun.jna.ptr.PointerByReference;
public class bositest {

public static void main(String[] args) {
// TODO Auto-generated method stub
int j = BosiAPI.insanceDll.PConnect();
System.out.println(j);
int i = BosiAPI.insanceDll.PLoginSuccess();
System.out.println(i);
kptest();
}


public static void kptest() {
System.out.println("开票测试");
String ZrTxt = "<&票据><&票据头>姓名=赵惠卿\t就诊号=12314\t保险编号=\t性别=女\t就诊科室=\t人员类别= \t医保类别=省医保\t付款方式=现金\t缴费流水号=2\t医保收据号=\t医疗费用总额= \t公务员补助支付=\t统筹金支付= \t个人现金支付= \t个人帐户支付= 大额补助支付= 上次账户余额= 个人账户余额=</&票据头><&收费项目>收费项目=R01 计费数量=3 收费标准=100 金额=300</&收费项目></&票据>";
PointerByReference pref = new PointerByReference();
String res = "";
int i = BosiAPI.insanceDll.PZrPj(ZrTxt, 1, "14004003", "这是备注", res);
System.out.println(i);
// Pointer p = pref.getValue();
// System.out.println(p);
// byte [] buffer = p.getByteArray(0,i);
// System.out.println(buffer);
System.out.println(res);
System.out.println("-------------------");
}

}

代码执行后博思软件那边可以正常接收数据 java这边获取不到res的值
博思的日志已经显示成功

有碰到相同问题帮下忙 感谢

...全文
876 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ξ衔☆泪】 2021-03-27
  • 打赏
  • 举报
回复
java这里,出参字节数组需要预先分配空间么?
HeroesIT 2020-12-10
  • 打赏
  • 举报
回复
引用 3 楼 weixin_41801581的回复:
大佬,你是怎么解决的
用字节数组接收的
weixin_41801581 2020-12-10
  • 打赏
  • 举报
回复
大佬,你是怎么解决的
HeroesIT 2020-09-29
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
String不能传入传出,所以应该用char[]数组
感谢大佬 可以接收到值了 去解决新问题了 返回的是乱码
routineMonkey 2021-09-28
  • 举报
回复
@HeroesIT 乱码问题解决了嘛
HeroesIT 2021-09-30
  • 举报
回复
@routineMonkey System.setProperty("jna.encoding","GBK");
qybao 2020-09-29
  • 打赏
  • 举报
回复
String不能传入传出,所以应该用char[]数组
目录 1 概述 1.1 简介 1.2 主页 1.3 安装 1.4 运行 1.4.1 运行脚本 1.4.2 运行字节码文件 1.5 关于 1.6 历史 1.7 联系方式 2 OllyMachine体系 2.1 核心 2.1.1 寻址空间 2.1.2 寄存器 2.1.3 标志位 2.2 工作流程 2.3 编译期错误 2.4 运行期异常 3 OllyMachine汇编语言 3.1 基本元素 3.1.1 指令 3.1.1.1 操作码 3.1.1.2 操作数 寄存器 标识符 整数常数 3.1.2 注释 3.2 标号 3.3 数据传送指令 3.3.1 MOV 3.3.2 XCHG 3.3.3 LDS 3.3.4 PUSH 3.3.5 POP 3.4 算术指令 3.4.1 加法指令 3.4.1.1 ADD 3.4.1.2 INC 3.4.2 减法指令 3.4.2.1 SUB 3.4.2.2 DEC 3.4.2.3 CMP 3.4.3 乘法指令 3.4.3.1 MUL 3.4.4 除法指令 3.4.4.1 MUL 3.5 逻辑指令 3.5.1 逻辑运算指令 3.5.1.1 AND 3.5.1.2 OR 3.5.1.3 NOT 3.5.1.4 XOR 3.5.2 移位指令 3.5.2.1 SHL 3.5.2.2 SHR 3.6 控制转移指令 3.6.1 无条件转移指令 3.6.1.1 JMP 3.6.2 条件转移指令 3.6.2.1 JE 3.6.2.2 JNE 3.6.2.3 JB 3.6.2.4 JNAE 3.6.2.5 JNB 3.6.2.6 JAE 3.6.2.7 JBE 3.6.2.8 JNA 3.6.2.9 JNBE 3.6.2.10 JA 3.7 其他指令 3.7.1 INCLUDE 3.7.2 NOP 3.7.3 PAUSE 3.7.4 HALT 3.7.5 INVOKE 4 OllyMachine API 4.1 Hello World! 4.2 调用方式 4.3 更简便的调用方式 4.4 返回 4.5 基本输入输出API 4.5.1 MSG 4.5.2 MSGYN 4.5.3 PrintNum 4.5.4 PrintBuf 4.5.5 PrintBufToDump 4.5.6 PrintBufToNewDump 4.5.7 UpdateDumpBuf 4.5.8 InputText 4.5.9 InputHexLong 4.6 内存操作API 4.6.1 ReadMemLong 4.6.2 WriteMemLong 4.6.3 WriteMemHexes 4.6.4 ReadFileIntoMem 4.6.5 DumpMem 4.6.6 DumpMemAppend 4.6.7 DumpAsPE 4.7 搜索和替换API 4.7.1 FindOpcode 4.7.2 Find 4.7.3 ReverseFind 4.7.4 Search 4.7.5 ReverseSearch 4.7.6 GetPrevOpAddr 4.7.7 GetNextOpAddr 4.7.8 GetProcAddress 4.7.9 Fill 4.7.10 ReplaceBytes 4.7.11 ReplaceBytesEx 4.7.12 CopyBytesTo 4.8 汇编API 4.8.1 ASM 4.8.2 __asm 4.8.3 Analyse 4.9 运行API 4.9.1 RunToReturn 4.9.2 RunToUserCode 4.9.3 Run 4.9.4 AnimateInto 4.9.5 AnimateOver 4.9.6 StepInto 4.9.7 StepIntoS 4.9.8 StepOver 4.9.9 StepOverS 4.9.10 ESTI 4.9.11 ESTO 4.9.12 GO 4.10 Trace API 4.10.1 TraceInto 4.10.2 TraceOver 4.10.3 TraceIntoCond 4.10.4 TraceOverCond 4.11 断点API 4.11.1 BP 4.11.2 BC 4.11.3 BPCND 4.11.4 BPL 4.11.5 BPLCND 4.11.6 BPRM 4.11.7 BPWM 4.11.8 BPMC 4.11.9 BPHWS 4.11.10 BPHWC 4.11.11 EOB 4.11.12 EOBINT3 4.11.13 EOBHW 4.11.14 EOBMEM 4.11.15 EOE 4.11.16 COB 4.11.17 COE 4.12 模块API 4.12.1 GMI 4.13 注释与标号API 4.13.1 Comment 4.13.2 SetLbl 4.14 日志API 4.14.1 LogText 4.14.2 LogLong 4.15 反反调试API 4.15.1 HideOD 4.15.2 UnHideOD 4.16 缓冲区API 4.16.1 malloc 4.16.2 free 4.16.3 VirtualAllocEx 4.16.4 VirtualFreeEx 4.16.5 strcpy 4.16.6 strcat 4.16.7 strlen 4.16.8 ltoa 4.16.9 memcpy 4.17 辅助调试API 4.17.1 FindProcBegin 4.17.2 FindProcEnd 4.17.3 FindPrevProc 4.17.4 FindNextProc 4.17.5 FollowCall 4.18 杂项API 4.18.1 IsWinNTKernel 4.18.2 GotoCpuAddr 4.18.3 GotoDumpAddr [首页, 上一页, 下一页; 目录 ]

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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