既然你只是絕對要有源(就像你必須有它的精簡框架本身和OS太)和自$ 50似乎是太陡,你得到了自衛隊的來源,這是我的捐贈給你。這是從一SDF代碼庫(任何人想知道,我擁有它,所以我沒有違反任何許可證):
public static Guid STORE_MOUNT_GUID = new Guid(_STORE_MOUNT_GUID);
internal const string _STORE_MOUNT_GUID =
"{C1115848-46FD-4976-BDE9-D79448457004}";
[DllImport("coredll.dll", SetLastError = true)]
private static extern IntPtr RequestDeviceNotifications(
byte[] devclass, IntPtr hMsgQ, bool fAll);
[DllImport("coredll.dll", SetLastError = true)]
private static extern bool StopDeviceNotifications(IntPtr h);
隊列指針可以使用Daniel Moth's P2P queue implementation(雖然它已知的錯誤是被檢索固定在SDF中)。我沒有發佈SDF實施,因爲對於一篇文章來說太長了。
在這一點上,它變得如此簡單:
public void StartStatusMonitoring()
{
if (!Active)
{
// Create a point-to-point message queue to get the notifications.
m_p2pmq = new P2PMessageQueue(true);
m_p2pmq.DataOnQueueChanged += new EventHandler(p2pmq_DataOnQueueChanged);
// Ask the system to notify our message queue when devices of
// the indicated class are added or removed.
m_requestHandle = RequestDeviceNotifications(m_deviceClass.ToByteArray(),
m_p2pmq.Handle, m_fAll);
}
}
我相信,有了這麼多的信息和你的時間沒有內在價值,你可以串所有的事實武裝這一起爲解決方案。
EDIT1
我要補充一點,加上所有這些代碼都不會解決您的問題100%。如果包含這個「修復」的代碼沒有被打亂,或者JITted代碼已經被修改,並且它的IL駐留在當存儲卡被拉出時不在RAM中的頁面,那麼該設備仍然會嘔吐。無論代碼是在運行應用程序代碼的「in」還是在單獨的程序集中,這都是事實,因此您認爲必須爲此提供源代碼纔是錯誤的。
添加此修復程序肯定會降低錯誤出現的機會窗口,但由於機會仍然存在,並且由於墨菲定律肯定適用於軟件推出,您幾乎可以保證這仍然會發生在領域。
亞..多數民衆贊成的權利...我用這個.. 問題是我得到WM_FILECHANGEINFO消息我的窗口處理程序是用C++編寫的,它存在於一個DLL中,從DLL執行sendmessage,它會來windowproc我的形式.. 我沒有得到如何取出窗體windowproc和recive所有通知的形式只使用C++ dll代碼..請幫助我,如果你知道 – Naruto 2009-09-23 09:49:52
我不知道你的方法可以避免本機C++代碼。 – MannyNS 2009-09-23 10:57:06
首先,我們需要爲窗體創建窗口過程,使用API的「GetWindowLong」和「SetWindowLong」API, 設置新窗口過程,然後在.exe中創建一個虛擬表單並註冊WM_FILECHANGEINFO消息。當卡被刪除時,我會得到SHCNE_DRIVEREMOVED消息,然後殺死進程。 – Naruto 2009-10-21 05:01:07