[問題] C++的dll用在C#中

看板C_and_CPP作者 (萬大林)時間11年前 (2012/08/30 17:00), 編輯推噓3(3021)
留言24則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC 2010 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 手上有個DLL, 我有原始檔 我想要引用他的一個function DECLDIR BOOL Get301SSnapbStatus(BYTE* bStatus); 所以我在C#中這樣使用 [DllImport("UVCXUControl.dll")] public static extern bool Get301SSnapbStatus(byte bStatus); 然後 但是他說無法載入, 找不到指定模組 上一次我這樣引入另一個dll的時候沒問題 這次出現這狀況不知道是他抓不到dll還是抓不到function 我有把dll搬到目錄下了 餵入的資料(Input): byte 預期的正確結果(Expected Output): 因為他是連接一個device 理論上會持續回傳false 如果有抓到就是true 錯誤結果(Wrong Output): 不知是抓不到dll還是抓不到內部的function 程式碼(Code):(請善用置底文網頁, 記得排版) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace captu { public partial class Form1 : Form { Byte SnapShotbStatus = 0; [DllImport("UVCXUControl.dll")] public static extern bool Get301SSnapbStatus(byte bStatus); public Form1() { InitializeComponent(); MessageBox.Show(Get301SSnapbStatus(SnapShotbStatus).ToString()); } } } 補充說明(Supplement): 這程式碼只是想要先抓到她回傳false的值 確定可以用才想說再來改 不過主要想問的是 如果遇到這種狀況是DLL真的不能用在C# 還是其他問題呢@@? -- 累積...http://wandal-lin.blogspot.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.62.181

08/30 17:05, , 1F
呼叫 mangling 過的名稱,或是用 def 檔編 dll 之類的吧
08/30 17:05, 1F

08/30 17:06, , 2F
不過你應該去 CSharp 問才對
08/30 17:06, 2F

08/30 17:10, , 3F
因為一開始其實我是打算改C++的程式...改到有點錯亂了
08/30 17:10, 3F

08/30 17:10, , 4F
都在這邊查資料 最後才突然想到用import
08/30 17:10, 4F

08/30 17:10, , 5F
不過因為C++的軟體不知道為什麼在我的電腦上都不能編譯
08/30 17:10, 5F

08/30 17:11, , 6F
所以我才PO到這邊來OTL 不知道是不是因為安裝太多版本
08/30 17:11, 6F

08/30 17:11, , 7F
每次拿到C++的專案都不能跑 超悶的= =
08/30 17:11, 7F

08/30 17:14, , 8F
你有先用c++去call 你編好的dll嗎?
08/30 17:14, 8F

08/30 17:24, , 9F
@@這個我真的還沒試過 我試試看
08/30 17:24, 9F

08/30 17:35, , 10F
有可能你 calling convention 沒指定正確
08/30 17:35, 10F

08/30 20:59, , 11F
F大您說的那個該怎麼檢查呢QQ?
08/30 20:59, 11F

08/30 21:14, , 12F
[DllImport("UVCXUControl.dll", CallingConvention=???)]
08/30 21:14, 12F

08/30 21:39, , 13F
c#不需要用到CallingXXX,直接給定dll路徑就好
08/30 21:39, 13F

08/30 21:40, , 14F
我這樣弄是ok的,你先用c++去call成功在走下一步
08/30 21:40, 14F

08/31 04:29, , 15F
BYTE*應該對應是IntPtr,不是byte吧
08/31 04:29, 15F

08/31 08:41, , 16F
可是我會用C#是因為不知為何我的電腦安裝C++軟體編譯
08/31 08:41, 16F

08/31 08:41, , 17F
都不會過...可是我給網友的電腦就可以過 不知道為什麼
08/31 08:41, 17F

08/31 08:42, , 18F
等於是說我根本沒辦法修改C++的程式碼 是因為跟C#互衝
08/31 08:42, 18F

08/31 08:42, , 19F
嗎???
08/31 08:42, 19F

08/31 08:45, , 20F
C++不會過是遇到什麼錯誤訊息?
08/31 08:45, 20F

08/31 09:47, , 21F
我可以抓到了OTL 想在問一下 我想模擬鍵盤傳送enter
08/31 09:47, 21F

08/31 09:47, , 22F
keybd_event(VK_RETURN ,0,0,0);
08/31 09:47, 22F

08/31 09:47, , 23F
keybd_event(VK_RETURN ,0,KEYEVENTF_KEYUP,0);
08/31 09:47, 23F

08/31 09:47, , 24F
這樣應該沒錯吧QQ
08/31 09:47, 24F
文章代碼(AID): #1GFol8e9 (C_and_CPP)