64位开发环境下编译32位dll文件


       最近在做PH项目的时候,遇到了一个小问题。我们做的系统,算是在人家基础上的一个二次开发:我们用到他们设备,同时需要他们给我们提供接口。我们拿到接口,在32位系统上编译不会出问题,而在我这64位系统上编译总是提示错误:


调用 Dll "试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)


       我一开始的想法是在网上重新找一个的新DLL文件,也就是64位的系统下的DLL文件,然后再注册一下就得了。可喜的是里面有X86和X64两个文件夹。X86里面有一个DLL文件,而X64却是空的。弄得我非常无语,然后我在网上继续找了DLL文件,一个一个的注册,弄了半天也没成功。


      问题已经很显然了,就是我的64位开发环境编译32位dll的问题。今天我换了个想法:怎样让它编译成功。问题很容易就解决了。

 

      打开VS,选中你项目的解决方法,右击选择属性(或者Alt+Enter),然后打开生成选项卡,将目标平台改为X86,这样编译出来的就是32位的dll了。同时,如果你的程序中含有关于指针的代码,一般会报错导致你无法编译,这是你需要在本选项卡中勾选“允许不安全代码选项”。




       解决问题之后才知道这个问题这么简单,同时也感觉到尽管VS已经用了好长时间,但是VS平台自己还不能说会用。


  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
××××××××××××××××××××××××××× × 《Windows环境下32位汇编语言程序设计》 × × 附书代码说明 × ××××××××××××××××××××××××××× 1. 编译器和链接器 本附书代码全部采用 MASM 格式编写,推荐使用 MASM32 软 件包作为编译环境,MASM32 软件包可以在以下地址下载: MASM32官方站点: http://www.masm32.com 安装及开发的操作系统建议采用32位的Windows 7,在64位操作系统 上安装 MASM32 软件包,安装生成的Lib文件可能不兼容。 安装完成以后请将本光盘根目录下的环境设置批处理文件Var.bat 拷贝到 Masm32\bin 目录下,并根据 MASM32 的安装位置编辑修改 Var.bat 文件中的相关目录名称。 2. 代码维护工具 每个例子都包括了描述编译、链接方法的 makefile 文件, 使用 nmake 工具可以自动根据此文件进行编译链接,nmake 工 具可以从 Visual C++ 的 bin 目录中找到,也可以从作者的网 站中下载。 3. 编译环境和编译方法 建议使用命令行方式进行编译,以编译 Chapter02\Test 目录中 Test.asm 为例,步骤是: I. 打开一个“命令提示符”窗口。 II. 进入环境设置批处理文件 Var.bat 所在目录并执行 它,以后就可以使用这个“命令提示符”窗口编译 文件了。 x: cd \masm32\bin var III. 进入源代码目录: cd \chapter02\test IV. 使用 nmake 工具进行编译链接: nmake V. 执行编译好的可执行文件。 如果需要对源代码进行修改,不必关闭“命令提示符”窗口, 只要切换到编辑器窗口,在修改 *.asm 文件后重复进行第 IV 和 第 V 步骤即可。 # 特别注意:将光盘中的代码拷贝到硬盘后,必须将文件的只读属性去除! 4. 本光盘所包含目录的说明 根目录下的 *.pdf ;附录A、B、C的电子版文档 Chapter02\Test ;测试编译环境 Chapter03\HelloWorld ;Hello World Chapter04\FirstWindow ;用Win32汇编写第一个窗口 Chapter04\FirstWindow-1 ;用Win32汇编写第一个窗口 Chapter04\SendMessage ;窗口间的消息互发 Chapter04\SendMessage-1 ;窗口间的消息互发 Chapter05\Menu ;使用资源 - 使用菜单 Chapter05\Icon ;使用资源 - 使用图标 Chapter05\Dialog ;使用资源 - 使用对话框 Chapter05\Listbox ;使用资源 - 使用列表框 Chapter05\Control ;使用资源 - 使用子窗口控件 Chapter05\ShowVersionInfo ;使用资源 - 显示版本信息资源的程序 Chapter05\VersionInfo ;使用资源 - 使用版本信息资源 Chapter06\Timer ;定时器的使用 Chapter07\DcCopy ;在两个窗口的 DC 间互相拷贝屏幕 Chapter07\Clock ;模拟时钟程序 Chapter07\BmpClock ;用 Bitmap 图片做背景的模拟时钟程序 Chapter07\TestObject ;一些常见的绘图操作 Chapter08\CommDlg ;使用通用对话框 Chapter09\Toolbar ;使用工具栏 Chapter09\StatusBar ;使用状态栏 Chapter09\Richedit ;使用丰富编辑控件 Chapter09\Wordpad ;一个完整的文本编辑器例子 Chapter09\SubClass ;窗口的子类化例子 Chapter09\SuperClass ;窗口的超类化例子 Chapter10\MemInfo ;显示当前内存的使用情况 Chapter10\FindFile ;全盘查找文件的例子 Chapter10\FormatText ;文件读写例子 Chapter10\FormatText\FileMap ;使用内存映射文件进行文件读写的例子 Chapter10\MMFShare ;使用内存映射文件进行进程间数据共享 Chapter11\Dll\Dll ;最简单的动态链接库例子 - 编写 DLL Chapter11\Dll\MASM Sample ;最简单的动态链接库例子 - 使用 DLL Chapter11\Dll\VC++ Sample ;最简单的动态链接库例子 - 在VC++中使用汇编编写的DLL Chapter11\KeyHook ;Windows 钩子的例子 - 监听键盘动作 Chapter11\RecHook ;Windows 日志记录钩子的例子 - 监听键盘动作 Chapter12\Counter ;有问题的程序 - 一个计数程序 Chapter12\Thread ;用多线程的方式解决上一个程序的问题 Chapter12\Event ;使用事件对象 Chapter12\ThreadSynErr ;一个存在同步问题的多线程程序 Chapter12\ThreadSyn\UseCriticalSection ;使用临界区对象解决多线程同步问题 Chapter12\ThreadSyn\UseEvent ;使用事件对象解决多线程同步问题 Chapter12\ThreadSyn\UseMutex ;使用互斥对象解决多线程同步问题 Chapter12\ThreadSyn\UseSemaphore ;使用信号灯对象解决多线程同步问题 Chapter13\CmdLine ;使用命令行参数 Chapter13\Process ;创建进程的例子 Chapter13\ProcessList ;显示系统中运行的进程列表 Chapter13\Patch1 ;一个内存补丁程序 Chapter13\Patch2 ;一个内存补丁程序 Chapter13\Patch3 ;一个内存补丁程序 Chapter13\HideProcess9x ;Windows 9x下的进程隐藏 Chapter13\RemoteThreadDll ;用 DLL 注入的方法实现远程进程 Chapter13\RemoteThread ;不依靠任何外部文件实现远程进程 Chapter14\TopHandler ;使用筛选器处理异常 Chapter14\SEH01 ;最基本结构化异常处理例子 Chapter14\SEH02 ;改进后的结构化异常处理例子 Chapter14\Unwind ;异常处理中的展开操作例子 Chapter15\Ini ;使用 INI 文件 Chapter15\Reg ;操作注册表的例子 Chapter15\Associate ;操作注册表实现文件关联 Chapter16\TcpEcho ;实现 TCP 服务器端的简单例子 Chapter16\Chat-TCP ;用 TCP 协议实现的聊天室例子 Chapter17\PeInfo ;查看 PE 文件的基本信息 Chapter17\Import ;查看 PE 文件的导入表 Chapter17\Export ;查看 PE 文件的导出表 Chapter17\Resource ;查看 PE 文件的资源列表 Chapter17\Reloc ;查看 PE 文件的重定位信息 Chapter17\NoImport ;不使用导入表调用 API 函数 Chapter17\AddCode ;在 PE 文件上附加可执行代码的例子 Chapter18\OdbcSample ;用ODBC操作数据库的例子 Appendix A\EchoLine ;控制台输入输出的例子 Appendix B\MsgWindow01 ;消息机制试验 1 Appendix B\MsgWindow02 ;消息机制试验 2 Appendix B\MsgWindow03 ;消息机制试验 3 Appendix B\MsgWindow04 ;消息机制试验 4 Appendix C\BrowseFolder ;浏览目录对话框 6. 联系作者 虽然本书中所有的例子代码都已经在32位的Windows 98、Windows 2000、 Windows XP、Windows Vista和Windows 7下测试通过,但也有存在Bug的可能,如果 发现代码存在错误或者有其它问题,请告知作者,联系方法: E-mail:[email protected] 感谢您的支持! 作者:罗云彬
### 回答1: 要在64位JDK环境下调用32位DLL文件,您需要执行以下步骤: 1. 确定您的操作系统是否为64位,如果是,请下载并安装32位Java运行时环境(JRE)。 2. 在32位Java JRE中编写代码,以便它可以调用32位DLL文件。请注意,由于32位DLL文件不受64位Java JRE支持,因此必须使用32位Java JRE。 3. 将32位DLL文件复制到您的计算机上,并确保它们位于Java可以找到的位置。可以将其复制到Java库路径或系统路径中。 4. 将32位DLL文件与Java代码连接起来。您可以使用Java Native Interface(JNI)来实现这一点。 JNI允许Java代码调用本地库(如DLL文件),并且可以在32位Java JRE和64位Java JRE中使用。 5. 在Java代码中使用System.loadLibrary()函数来加载32位DLL文件。 6. 测试您的代码并确保它可以正确调用32位DLL文件。 ### 回答2: 在64位JDK环境中调用32位DLL文件的问题可以通过以下步骤解决: 1. 确认操作系统:首先需要确保操作系统是64位版本的。如果操作系统是32位的,那么无论使用哪个版本的JDK,都只能调用32位DLL文件。 2. 安装32位JDK:在64位JDK环境中调用32位DLL文件,需要安装32位的JDK。因为32位DLL文件是由32位JDK生成的,所以只有相同位数的JDK能够正确地加载并调用DLL文件。 3. 配置环境变量:将32位JDK的安装路径添加到系统的环境变量中。这样,可以确保在命令行或其他开发工具中使用32位JDK进行编译和运行程序。 4. 设置Java库路径:在Java代码中,使用System.setProperty("java.library.path", "DLL文件路径")指定DLL文件的路径。这样,JVM会在指定的路径中找到并加载32位DLL文件。 5. 使用32位JRE:如果使用的是JRE而不是JDK,同样需要安装32位的JRE,并在环境变量中配置正确的JRE路径。 需要注意的是,64位JDK环境中调用32位DLL文件可能会导致兼容性问题。因此,建议尽可能使用相同位数的JDK和DLL文件。如果DLL文件是由第三方提供的,可以尝试联系DLL文件的提供方,获取64位版本的DLL文件。 总结起来,解决64位JDK环境中调用32位DLL文件的问题,需要确认操作系统位数,安装相同位数的JDK或JRE,并配置正确的环境变量和Java库路径。 ### 回答3: 要在64位JDK环境中调用32位DLL文件,我们需要采取以下解决方法: 1. 选择32位JDK环境:如果可能的话,可以考虑安装32位JDK环境,因为32位JDK环境能兼容32位DLL文件。这样就可以直接使用32位JDK环境调用32位DLL文件,无需做其他处理。 2. 使用Java Native Interface(JNI):JNI是Java提供的一种机制,允许Java代码调用本地语言的函数。通过编写桥接函数,将Java代码与DLL文件连接起来。在编写JNI函数时,需要根据DLL文件的调用规范(例如C调用规范)进行适当的声明和封装。 3. 使用Java Native Access(JNA)库:JNA是一个开源库,可以简化Java调用本地函数的过程。通过使用JNA库,在Java代码中声明和定义DLL文件的函数和数据结构,使得可以直接调用32位DLL文件中的函数。在JNA中,没有必要编写JNI函数,而是通过直接调用DLL文件的函数来实现功能。 4. 通过进程间通信(IPC):如果以上方法都无法解决问题,可以考虑通过IPC与一个32位进程进行通信。在32位进程中加载32位DLL文件,并提供接口让64位JDK环境中的Java代码调用。可以使用进程间通信机制,如共享内存或管道,实现Java代码与32位进程之间的数据交换和通信。 以上是解决64位JDK环境中调用32位DLL文件的一些方法。根据具体情况选择适合的解决方案,并根据需求进行详细实施和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值