2016-02-27 142 views
1

我一直在嘗試從Oculus Rift中讀取數據一段時間。我希望它能夠在Visual Basic中工作,但唯一可用的代碼在C++中工作。所以我製作了一個C++ DLL,用於從裂痕中讀取數據,並且我想在VB中使用它。問題是我不太清楚我在做什麼,所以如果你能記住我是一個真正的白人,那麼這很棒。從Visual Basic調用C++ DLL

我以前關於如何創建DLL此嘖:https://www.youtube.com/watch?v=XdSbp1A6eQc

這裏是C++代碼讀取數據斷裂痕:

#include <iostream> 
#include "OVR_CAPI_D3D.h" 
#include "Extras/OVR_Math.h" 

using namespace std; 
using namespace OVR; 

int main() 
{ 
ovrHmd HMD; 
ovrGraphicsLuid luid; 
ovr_Initialize(nullptr); 
ovr_Create(&HMD, &luid); 
ovrHmdDesc hmdDesc = ovr_GetHmdDesc(HMD); 

    float yaw, pitch, roll; 

    while (true) 
{ 
    double frameTime = ovr_GetPredictedDisplayTime(HMD, 0); 
    double sensorSampleTime = ovr_GetTimeInSeconds(); 
    ovrTrackingState hmdState = ovr_GetTrackingState(HMD, frameTime, ovrTrue); 
    ovrPosef thePose = hmdState.HeadPose.ThePose; 
    Quatf(thePose.Orientation).GetYawPitchRoll(&yaw, &pitch, &roll); 

    cout << "yaw: " << RadToDegree(yaw) << ", pitch: " << RadToDegree(pitch) << ", roll: " << RadToDegree(roll) << endl; 
} 

ovr_Destroy(HMD); 
ovr_Shutdown(); 
} 

我提出另一C++程序和測試的DLL,並檢查完成。 我然後做了VB程序導入的DLL,但我不能讓它工作:

Imports System.Runtime.InteropServices 
Imports System 


Module Module1 
Private Declare Sub getriftinfo Lib "RiftDLL.dll" Alias "getriftdata"() 

Sub Main() 
    getriftinfo() 
End Sub 

End Module 

當我運行的代碼,程序崩潰和控制檯消息顯示出來說: 未處理的異常系統.badimageformatexception一個試圖加載程序格式不正確

而且,我不太肯定把DLL

謝謝你們!那意義重大。

+0

不是通過代碼聲明它,你是否嘗試在項目中添加它作爲參考,並將其添加爲導入以便引用它? –

+0

你能告訴我如何?我都是耳朵。 – Zock77

+0

這是否適用於C++ DLL? – Zock77

回答

0

你確定這兩個程序的目標是32位或64位。如果你混合32位和64位庫,它可能會引發這種錯誤。

我想你的權利,該DLL可能會在錯誤的位置。通常,您可以將它包含在您的bin中,然後在visual studio中的項目中包含引用。

此答案可能會對您有所幫助:https://social.msdn.microsoft.com/Forums/en-US/f228007d-35eb-4ab5-b541-c10ece3b980b/help-using-c-dll-functions-in-vbnet?forum=vblanguage

+0

我不太確定。我在同一臺個人電腦上編譯了兩個,他們怎麼可能有不同的比特率? – Zock77

+0

在Visual Studio項目編譯選項中,您定位了x64,x86或任何CPU。 – Joel

+0

也許問題是你正在從託管代碼調用非託管代碼。根據這篇文章,他們似乎認爲這隻適用於32位代碼或x86。 http://www.harding.edu/fmccown/callunmanaged.html – Joel