2010-07-01 104 views
1

所以我试图让这个核仪器硬件工作。我可以在win32 C++项目中使用64位驱动程序的api吗?

我已经安装了64位驱动程序(我使用的是Windows 7 64位),我已经下载了与之配套的dll。

当我添加的dll文件,并尝试使用该功能,在视觉工作室一个Win32控制台应用程序项目,它给了我一个链接错误:

错误1个错误LNK2019:解析外部符号_CAENVME_SWRelease @ 4在功能上引用_main main.obj vmeTest

我想这意味着它无法在dll中找到函数CAENVME_SWRelease。

我已经将dll和相应的.lib和头文件一起添加到了项目中,并将它们添加到了参考文件中(我已经尝试将它们添加到路径环境变量中,并且在其他库目录中的链接程序下)< --not必须这样做,但认为我会尝试),但它不会工作。

为了看看我是不是做得不对,我尝试创建一个dll并以相同的方式将其添加到项目中,并且它工作正常。

所以我想知道是否因为我使用的是win32项目,这些dll是64位(因为它们是64位驱动程序?)。

显然我不知道我在说什么。任何人都可以给我一些帮助或刺探可能发生的事情吗?

这里的功能是如何在头文件中定义:

CAENVME_API 
CAENVME_SWRelease(char *SwRel); 

,我把它称为是这样的:

char dog; 
CAENVME_SWRelease(&dog); 
cout << dog 

回答

1

在符号名_CAENVME_SWRelease @ 4,@ 4'堆栈中参数的长度(以字节为单位) - 32位指针的4个字节。在64位这将是8个字节,所以这个函数将被改为'@ 8',这就是名字解析失败的原因。

[至少它会64位stdcall像32位一样被改变方式,但事实并非如此。在任何情况下,现在都有足够的寄存器来传递寄存器中的前几个参数,所以这不会在堆栈中结束,并且重要的是调用者和被调用者对stdcall中堆栈中的字节数量达成一致(被调用者清理),这就是名称中的数字来源。谢谢汉斯!]

但是,不,即使你确实得到这个权利,你不能连接这样的32位和64位代码。抱歉。

题外话:我怀疑你真正想要

char SwRel[256]; 
CAENVME_SWRelease(SwRel); 

我怀疑这将填补一个缓冲区的字符串,而不是回报你一个字符。然而,由于它不接受缓冲区大小参数,所以它不是真正的,所以你所能做的只是有意识地将缓冲区大小瞄准高。

+1

64位STDCALL名装修不使用@n后缀,参数是通过传递一个注册表。否则,OP需要链接32位版本的.lib或构建其程序的x64版本。 – 2010-07-01 17:44:09

+0

噢,是的。我还没有深入了解64位Windows。 – Rup 2010-07-01 17:46:14

+0

那么32位版本的.lib能够控制我已经安装的64位驱动程序(显然,我不能安装32位驱动程序),或者是唯一的选项来编写我的程序在64位?该库的32位版本可用。感谢您的答复。 – Johnny 2010-07-01 19:46:51

0

进入你的项目你必须添加另一个“目标”添加一个x64的目的地这将帮助你。

但是您必须拥有64位所有使用的库。

检查这里了解更多信息,请关心指针(简直是一场噩梦,但可能)

http://msdn.microsoft.com/en-us/library/aa384204.aspx

相关问题