2010-07-01 75 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

相關問題