如何创建可在其他计算机上运行的可再发行DLL

时间:2013-08-20 09:48:57

标签: c++ visual-c++ dll

我试图创建一个GUI,尝试与连接到计算机的CAN外围设备连接,并允许计算机和微控制器之间的通信。大多数工作都是用Java完成的,但CAN代码是用C ++编写的,并且是使用JNI从Java调用的。我正在使用Visual Studio 2013 for C ++和Eclipse for Java。

该程序在开发计算机上运行良好,但我对创建DLL没有经验,而且我无法让程序在另一台计算机上运行。我已经使用了Dependency Walker来了解我应该将什么DLL与应用程序捆绑在一起,此时我已经包含了它所说的丢失的所有DLL(那里)有一些说它仍然缺失,但它说开发计算机上也缺少这些,我相信这只是Dependency Walker的一个问题。)

应用程序文件夹包含GUI的可运行jar文件,我创建的DLL和从属DLL。我尝试使用" java -jar {application.jar}"从命令行运行应用程序。我收到以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: C:\Users\David\Dropbox\ATPBoardInterface\CANMessager7.dll: A dynamic link library (DLL) initialization routine failed
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1939)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1864)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at model.CANController.<clinit>(CANController.java:34)
    at main.Main$1.run(Main.java:70)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:682)
    at java.awt.EventQueue$3.run(EventQueue.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

我正在寻找有关如何解决此问题的建议。我可以与任何其他Windows计算机共享的内容,以便最终用户轻松安装和运行。

编辑:如果它有所不同,该程序依赖于使用National Instruments&#39; CAN软件。我在应用程序文件夹中包含了许多DLL,其中列出了Dependency Walker,但我不确定这是否足够。也许目标计算机需要安装某些NI软件才能工作,如果它丢失了,可能会导致DLL初始化失败?我对这类领域不够熟悉,无论如何都要确定。

编辑2:这是我在应用程序文件夹中捆绑的内容:

20/08/2013  10:56    <DIR>          .
20/08/2013  10:56    <DIR>          ..
20/08/2013  08:26           427,170 ATPBoardInterface.jar
20/08/2013  09:28           182,928 CANMessager.lib
20/08/2013  08:52           201,728 CANMessager7.dll
15/08/2013  16:28            30,720 CANMessagerXP.dll
16/06/2013  21:11           966,224 msvcr120.dll
11/07/2006  18:35           348,160 msvcr71.dll
13/10/2012  11:00           655,872 msvcr90.dll
01/06/2011  17:59            45,192 Nican.dll
06/04/2010  17:44            72,224 NicanCfq.dll
06/04/2010  17:44           125,472 nicanDBA.dll
01/06/2011  17:59           197,784 NIcanFrm.dll
01/06/2011  17:59            18,080 NIcanpu.dll
01/06/2011  17:59            61,568 NicanTsk.dll
26/01/2012  15:54            19,632 nipal32.dll
26/01/2012  16:11           309,920 nipalu.dll
26/01/2012  15:53            12,968 nipalut.dll
19/08/2013  16:18               772 README.txt
20/08/2013  08:34    <DIR>          res
20/08/2013  10:56                 0 temp.txt
20/08/2013  09:43         6,494,784 vcredist_x86.exe
              19 File(s)     10,171,198 bytes
               3 Dir(s)  416,406,867,968 bytes free

我不确定这些是必要的。

1 个答案:

答案 0 :(得分:0)

一个问题可能是32/64位问题。

如果您的CAN接口DLL是32位DLL并且您运行64位Java,则无法使用。使用32位Java运行64位DLL也无法正常工作。

唯一的解决方案是将DLL编译为32位和64位版本并提供两个DLL版本。

如果32/64位不是问题,您可以使用SysInternals ProcessExplorer工具查看所有文件访问尝试。在这种情况下,您将看到Java是否尝试访问任何不存在的DLL文件。

32/64位问题的解决方案是使用命令行EXE文件而不是DLL文件。使用标准输出和输入(在C ++端)并使用Java端的java.lang.Process类的InputStream和OutputStream传输数据。这将始终与32位EXE文件一起使用。