關於 VFW / DllImport 二合一發問0.0" |
尚未結案
|
rik
一般會員 發表:40 回覆:81 積分:24 註冊:2004-09-24 發送簡訊給我 |
(1) 有人有在C#NET用過VFW嗎?
(沒有也沒關係 這算順便問的@@") (2) 在之前的擷取攝影機影像程式中
API Declarations內 有此句
[DllImport("avicap32.dll", EntryPoint="capCreateCaptureWindowA")]
public static extern int capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID); 我主要想問 有人知道
capDriverConnect capPreview capPreviewScale
capPreviewRate capOverlay
這五個函式 DllImport() 內要怎魔宣告嗎?
或是知道如何查詢 我測試過
[DllImport("avicap32.dll", EntryPoint="capDriverConnect")]
public static extern int capDriverConnect (int hCapWnd, int K);
與 以此類推的4個宣告
但執行是錯誤的(編譯過的了) 執行到這行時會顯示
找不到名為capDriverConnect的進入點(於avicap32.dll中) (3) DllImport 是用來使用寫在 如DLL檔內的函式嗎@@? (只是要給進入點)
感覺有點類似include (也可能是因為我經驗不夠才這樣認為0.0a")
------
時與不時的撿起身旁的拼圖碎片 不懂的部分 半解的部分 就像一塊拼圖 留於腦中 等待拼出完美解答的一天 這就是我的思路 我的創作方法 而我也接受 這作法所帶來的"代價" - 時間 |
windblown
中階會員 發表:0 回覆:117 積分:98 註冊:2003-11-14 發送簡訊給我 |
1 沒有 >_<
2 經過我追蹤的結果 avicap32.dll 沒有你說的進入點,而都是 macro
#define capDriverConnect(hwnd, i) ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_CONNECT, (WPARAM)(i), 0L)) #define AVICapSM(hwnd,m,w,l) ( (IsWindow(hwnd)) ? ::SendMessage(hwnd,m,w,l) : 0) SendMessage(hwnd, WM_CAP_DRIVER_CONNECT, i, 0L); #define capPreview(hwnd, f) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_PREVIEW, (WPARAM)(BOOL)(f), 0L)) SendMessage(hwnd, WM_CAP_SET_PREVIEW, f, 0L); #define capPreviewScale(hwnd, f) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_SCALE, (WPARAM)(BOOL)f, 0L)) SendMessage(hwnd, WM_CAP_SET_SCALE, f, 0L); #define capPreviewRate(hwnd, wMS) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_PREVIEWRATE, (WPARAM)(wMS), 0)) SendMessage(hwnd, WM_CAP_SET_PREVIEWRATE, wMS, 0L); #define capOverlay(hwnd, f) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_OVERLAY, (WPARAM)(BOOL)(f), 0L)) SendMessage(hwnd, WM_CAP_SET_OVERLAY, f, 0L);因此會 SendMessage() 即可;用法如下 [DllImport("user32.dll",EntryPoint="SendMessage")] public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam); 3 個人認為像 LoadLibrary(), GetProcAddress() 這些 function 的結合體 |
rik
一般會員 發表:40 回覆:81 積分:24 註冊:2004-09-24 發送簡訊給我 |
引言: 1 沒有 >_< 2 經過我追蹤的結果 avicap32.dll 沒有你說的進入點,而都是 macro我找的程式裡面也有用SendMessage 以下又是問題@@" (1)他有宣告以下 似乎是為了使用SendMessage 而準備 public const int WM_USER = 1024; public const int WM_CAP_CONNECT = 1034; public const int WM_CAP_DISCONNECT = 1035; public const int WM_CAP_GET_FRAME = 1084; public const int WM_CAP_COPY = 1054; public const int WM_CAP_START = WM_USER; //開始 public const int WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START 41; //DLG video format public const int WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START 42; //DLG video source public const int WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START 43; //DLG video display public const int WM_CAP_GET_VIDEOFORMAT = WM_CAP_START 44; //Get video format public const int WM_CAP_SET_VIDEOFORMAT = WM_CAP_START 45; //Set video format public const int WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START 46; public const int WM_CAP_SET_PREVIEW = WM_CAP_START 50; 我要問的是 這皆變數(常數)宣告一定要做嗎@@? (如果是在C中 include .h後 通常.h檔內就已經有define這些常數 就是差在這 所以DllImport 和include 有差距摟@@?) (2) 這其實有點接上題 如你所寫 如果我能使用 SendMessage(hwnd, WM_CAP_DRIVER_CONNECT, i, 0L); SendMessage(hwnd, WM_CAP_SET_PREVIEW, f, 0L); SendMessage(hwnd, WM_CAP_SET_SCALE, f, 0L); SendMessage(hwnd, WM_CAP_SET_PREVIEWRATE, wMS, 0L); SendMessage(hwnd, WM_CAP_SET_OVERLAY, f, 0L); 這些函式 那就類似在使用 capDriverConnect capPreview capPreviewScale capPreviewRate capOverlay 也就是說我現在需要找出WM_CAP_DRIVER_CONNECT 等 所代表的值? ----------------------------補充說明----------------------------------- 之前取得的程式碼 用 capCreateCaptureWindowA 當開頭 在使用 SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0); SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 0, 0); 最後再用 // get the next frame; SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0); // copy the frame to the clipboard GerReturn=GerReturn=SendMessage(mCapHwnd, WM_CAP_COPY, 0, 0) 把影像在於剪貼簿 只是其中有邏輯錯誤 有點複雜 我認為討論是這樣寫 (剪貼簿貼滿一輪迴(198個frame)後 就再也抓不到影像) 所以我才把思路放於在BCB上 瞞多人用於影像擷取的方法VFW#define capDriverConnect(hwnd, i) ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_CONNECT, (WPARAM)(i), 0L)) #define AVICapSM(hwnd,m,w,l) ( (IsWindow(hwnd)) ? ::SendMessage(hwnd,m,w,l) : 0) SendMessage(hwnd, WM_CAP_DRIVER_CONNECT, i, 0L); 這個是追蹤進入點的程式嗎@@? (確認一下^^") C#NET好像不能用#define @@" 所以這個code不能在C#NET跑@@? ( 但我沒說SendMessage(hwnd, WM_CAP_DRIVER_CONNECT, i, 0L);不能在C#NET用喔@@" ) #define capPreview(hwnd, f) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_PREVIEW, (WPARAM)(BOOL)(f), 0L)) SendMessage(hwnd, WM_CAP_SET_PREVIEW, f, 0L); #define capPreviewScale(hwnd, f) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_SCALE, (WPARAM)(BOOL)f, 0L)) SendMessage(hwnd, WM_CAP_SET_SCALE, f, 0L); #define capPreviewRate(hwnd, wMS) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_PREVIEWRATE, (WPARAM)(wMS), 0)) SendMessage(hwnd, WM_CAP_SET_PREVIEWRATE, wMS, 0L); #define capOverlay(hwnd, f) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_OVERLAY, (WPARAM)(BOOL)(f), 0L)) SendMessage(hwnd, WM_CAP_SET_OVERLAY, f, 0L);因此會 SendMessage() 即可;用法如下 [DllImport("user32.dll",EntryPoint="SendMessage")] public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam); 3 個人認為像 LoadLibrary(), GetProcAddress() 這些 function 的結合體
------
時與不時的撿起身旁的拼圖碎片 不懂的部分 半解的部分 就像一塊拼圖 留於腦中 等待拼出完美解答的一天 這就是我的思路 我的創作方法 而我也接受 這作法所帶來的"代價" - 時間 |
windblown
中階會員 發表:0 回覆:117 積分:98 註冊:2003-11-14 發送簡訊給我 |
因為 C# 不支援 macro, 所以必須轉成 const int 來處理;這不能說 DllImport 和include 有差距,應該說轉成 C# 可以用的方法
ex: c/c++ #define pi 3.14159
到了 C# 必須變成 public const double pi = 3.14159; 此時就不是 const int 最後結果應該如下,沒有攝影機沒辦法試 >_<
public const int WM_USER = 0x0400; public const int WM_CAP_START = WM_USER; public const int WM_CAP_DRIVER_CONNECT = (WM_CAP_START 10); public const int WM_CAP_SET_PREVIEW = (WM_CAP_START 50); public const int WM_CAP_SET_OVERLAY = (WM_CAP_START 51); public const int WM_CAP_SET_PREVIEWRATE = (WM_CAP_START 52); public const int WM_CAP_SET_SCALE = (WM_CAP_START 53); [DllImport("user32.dll",EntryPoint="SendMessage")] public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam); public static bool capDriverConnect(int hwnd, int iIndex) { return 0!=SendMessage(hwnd, WM_CAP_DRIVER_CONNECT, iIndex, 0); } public static bool capPreview(int hwnd, int flag) { return 0!=SendMessage(hwnd, WM_CAP_SET_PREVIEW, flag, 0); } public static bool capPreviewScale(int hwnd, int flag) { return 0!=SendMessage(hwnd, WM_CAP_SET_SCALE, flag, 0); } public static bool capPreviewRate(int hwnd, int wMS) { return 0!=SendMessage(hwnd, WM_CAP_SET_PREVIEWRATE, wMS, 0); } public static bool capOverlay(int hwnd, int flag) { return 0!=SendMessage(hwnd, WM_CAP_SET_OVERLAY, flag, 0); } |
rik
一般會員 發表:40 回覆:81 積分:24 註冊:2004-09-24 發送簡訊給我 |
引言: 因為 C# 不支援 macro, 所以必須轉成 const int 來處理;這不能說 DllImport 和include 有差距,應該說轉成 C# 可以用的方法 ex: c/c #define pi 3.14159 到了 C# 必須變成 public const double pi = 3.14159; 此時就不是 const int 最後結果應該如下,沒有攝影機沒辦法試 >_<你的程式編輯可以成功^^ 再來有個新問題@@" 問題(1) SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0); 後的frame到底存在哪@@? 有沒有辦法放入pictureBox ?? 一定要用 SendMessage(mCapHwnd, WM_CAP_COPY, 0, 0); 把他放到剪貼簿嗎? 因為之前我拿到的程式 就是因為剪貼簿的使用上有問題 才會產生BUG的 所以這次才想用VFW方法來擷取影像 只是又遇到問題2... 問題(2) 之前看 VFW的範例時(於BCB) 有4種取得影像的方法 取出法 PS: code是直接轉貼@@" * (1) Image1->Picture->LoadFromClipboardFormat(CF_BITMAP,Clipboard()->GetAsHandle(CF_BITMAP),0); * 剪貼簿= =" * (2) //用一個button1元件,儲存擷取影像到資料檔-------------------------------------- * void __fastcall TForm1::Button1Click(TObject *Sender) * { * ghCapWnd=vc1; * CapBmpPic("C:\\My Documents\\My Pictures\\1.bmp"); //存成bmp檔 * } * (3) //存成bmp格式----------------------------------------------------------------- * void __fastcall TForm1::CapBmpPic(String FileName) * { * capFileSaveDIB(ghCapWnd,FileName.c_str()); * } * (4) //用一個button4元件,直接擷取影像到Panel2-------------------------------------- * void __fastcall TForm1::Button4Click(TObject *Sender) * { * Image1->Visible = true; * ghCapWnd=vc1; * capSetCallbackOnFrame(ghCapWnd,&FrameCallBack); * } 我是意屬第4個 只是..... * * (1)那篇文章最後有人發現按第4個時會出現BUG * * (2)define中 好像沒 capSetCallbackOnFrame 這個0.0 * * (3)就算有....我沒記錯的話= =" SendMessage() 是return int * * 要怎麼和pictureBox 作link= ="public const int WM_USER = 0x0400; public const int WM_CAP_START = WM_USER; public const int WM_CAP_DRIVER_CONNECT = (WM_CAP_START 10); public const int WM_CAP_SET_PREVIEW = (WM_CAP_START 50); public const int WM_CAP_SET_OVERLAY = (WM_CAP_START 51); public const int WM_CAP_SET_PREVIEWRATE = (WM_CAP_START 52); public const int WM_CAP_SET_SCALE = (WM_CAP_START 53); [DllImport("user32.dll",EntryPoint="SendMessage")] public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam); public static bool capDriverConnect(int hwnd, int iIndex) { return 0!=SendMessage(hwnd, WM_CAP_DRIVER_CONNECT, iIndex, 0); } public static bool capPreview(int hwnd, int flag) { return 0!=SendMessage(hwnd, WM_CAP_SET_PREVIEW, flag, 0); } public static bool capPreviewScale(int hwnd, int flag) { return 0!=SendMessage(hwnd, WM_CAP_SET_SCALE, flag, 0); } public static bool capPreviewRate(int hwnd, int wMS) { return 0!=SendMessage(hwnd, WM_CAP_SET_PREVIEWRATE, wMS, 0); } public static bool capOverlay(int hwnd, int flag) { return 0!=SendMessage(hwnd, WM_CAP_SET_OVERLAY, flag, 0); }
------
時與不時的撿起身旁的拼圖碎片 不懂的部分 半解的部分 就像一塊拼圖 留於腦中 等待拼出完美解答的一天 這就是我的思路 我的創作方法 而我也接受 這作法所帶來的"代價" - 時間 |
windblown
中階會員 發表:0 回覆:117 積分:98 註冊:2003-11-14 發送簡訊給我 |
|
rik
一般會員 發表:40 回覆:81 積分:24 註冊:2004-09-24 發送簡訊給我 |
引言: 我選 (3) 方法同另一篇 SendMessahe() 的 overload method 寫法你是指這篇嗎? (我順便留下捷徑 以免以後有人看不懂..) http://delphi.ktop.com.tw/topic.php?TOPIC_ID=76825 這個方法遇到的問題 我寫在那篇了0.0 等那個問題解決 確定可以 我在整理貼回這 有其他方法/想法 歡迎提供= =" 目前我也只能這樣一直try code 如果不是那篇 請PO一下捷徑^^
------
時與不時的撿起身旁的拼圖碎片 不懂的部分 半解的部分 就像一塊拼圖 留於腦中 等待拼出完美解答的一天 這就是我的思路 我的創作方法 而我也接受 這作法所帶來的"代價" - 時間 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |