高手救命!
公司项目有个需求,就是web网站要集成考勤机。
本人需要用java语言调用考勤机相关软件包,进行数据的维护;但是硬件厂商只提供了几个dll文件和对应的ocx文件,相关的帮助文档中只有方法名和参数。
关于java如何调用其中的dll方法,本人研究了好几天了,通过在网上查找资料,尝试了jawin,jnative,jcob等项目,均不理想,关键是c语法参数与java语法参数的匹配转换是个难点,网上的一些案例介绍都是一些非常简单的例子,基本没有帮助意义。本人觉得还是jnative对于参数的匹配模式容易理解些,学习其源码中user32类和另外一个类(名字忘了),但是还是没有头绪:例如它有时用Pointer匹配LPSTR * 类型数据,有时又用Pointer里的Pointer匹配;看得本人云里雾里;还有,创建指针时,其内存块有的是4,有的是32等等,是不是用jnative转换类型还要知道底层c语法的参数结构才行?我不知道c语法的dll库文件源码,Jnative有没有一个透明的针对c语法参数的匹配规律?
希望有高人指点,谢谢。
如果能0距离指点,更加感激不尽了,为了完成任务,本人已经吃不香睡不相了。
qq号码:371319819

解决方案 »

  1.   

    我也觉得jnative好用,不过前提是对c的指针和内存分配都比较熟悉将内存的数据读到byte[]然后自己转换,也是不错的选择
      

  2.   

    别用java调dll了,写一个程序通过c或c#去调,然后通过webservice或socket的方式接收java发来的指令去调用dll的相关方法并返回结果.
      

  3.   

    谢谢各位的支持,如果不用这么麻烦,我也不想为这事烦恼啊。
    我们公司的一个协同办公项目需要集成考勤机,目前市面上的考勤机大部分都是c写的,而且他们给的demo是vb版的。
    提供的文件只有dll和ocx,不要和我说考虑用vb调用dll和ocx。如果可以的话,希望有人指点下怎么用JNative处理dll中的指针型参数,例如c中返回的Date * 型变量,在java中怎么解析它的返回值?我用各个指针变量的getPoiter()方法得到的好像是内存地址,怎么得到该地址里的数据呢?java应该不能直接读取指定内存地址里的数据的。
      

  4.   

    3楼的高手,请问怎么用Byte[]解析内存中读到的数据啊?有没有一个比较全面的例子?这几天通过百度搜索,感觉网上对jnative等偏门技术的了解者非常少,相关的中文文档介绍更是没有,希望有高手能对这些实用的知识进行下总结并开源,那就感激不尽了。
      

  5.   

    其实如果能确保C/C++类型长度跟java的类型长度一样的话,直接用memcpy,内存拷贝就可以了
    用byte[]原理也是一样的,通过memcpy把内存信息拷贝到byte数组里,然后根据C/C++或java的类型长度对byte[]进行对应的移位运算等,然后再memcpy拷贝到相应的结构体中
      

  6.   

    其实理解c语言变量结构的话,没什么难点也就这么几种类型:char int float等基本类型,外加指针,这些jnative都能一一对应麻烦的也就是指针的对应,
    其实对于指针指向的是什么类型是无所谓的(就算java知道了也没用)
    但是必须知道指针所指向的内存地址的数据存储方式如此保存到byte[]就可以自己解析了说白了,最通用的方法就是用byte[]去代替c的指针
      

  7.   

    有两条比较好的路
    一是用JNA
    二是把ocx做成控件
    在web上调用
      

  8.   

    通过byte[]的方式来翻译java和c的参数是一个好思路,我先研究一下,如果有效果,我就上来把我的心得贴上来并散分,谢谢各位了。
      

  9.   

    不好意思,这几天有其他的事忙,关于用jnative调用dll库的研究只好暂时搁置。如果有成果,再来贴。现在开始散分。
      

  10.   

    楼主能否分享下代码?最进也在弄这个,可以发我邮箱里,非常感谢[email protected]