線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3340
推到 Plurk!
推到 Facebook!

關於 VFW / DllImport 二合一發問0.0"

尚未結案
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-11 05:06:21 IP:59.104.xxx.xxx 未訂閱
(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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-11 11:34:16 IP:61.229.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-11 15:05:23 IP:59.104.xxx.xxx 未訂閱
引言: 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);
  這個是追蹤進入點的程式嗎@@? (確認一下^^")
  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 的結合體
我找的程式裡面也有用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
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
windblown
中階會員


發表:0
回覆:117
積分:98
註冊:2003-11-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-12 12:09:58 IP:61.229.xxx.xxx 未訂閱
因為 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-12 15:53:39 IP:203.67.xxx.xxx 未訂閱
引言: 因為 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);
}
你的程式編輯可以成功^^ 再來有個新問題@@" 問題(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= ="
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
windblown
中階會員


發表:0
回覆:117
積分:98
註冊:2003-11-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-17 17:32:18 IP:61.229.xxx.xxx 未訂閱
我選 (3) 方法同另一篇 SendMessahe() 的 overload method 寫法
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-17 23:33:08 IP:59.104.xxx.xxx 未訂閱
引言: 我選 (3) 方法同另一篇 SendMessahe() 的 overload method 寫法
你是指這篇嗎? (我順便留下捷徑 以免以後有人看不懂..) http://delphi.ktop.com.tw/topic.php?TOPIC_ID=76825 這個方法遇到的問題 我寫在那篇了0.0 等那個問題解決 確定可以 我在整理貼回這 有其他方法/想法 歡迎提供= =" 目前我也只能這樣一直try code 如果不是那篇 請PO一下捷徑^^
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
系統時間:2024-04-18 15:30:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!