2009-09-23 30 views
1

我做的Windows移動應用程序,它指的是一些DLL的,但我在這裏有一些問題。 想象一下,我的應用程序只安裝在存儲卡相關的DLL存儲卡中, 如果我啓動應用程序它引用了一些DLL,現在我將刪除存儲卡,仍然我的應用程序將運行,它不會退出,只是最終它導致重新啓動我的移動設備.. 我得到的設備卡刪除通知,但它的DLL和它的c + +代碼..如果卡被刪除沒有DLL將出現在存儲卡,我甚至沒有得到通知也在C#我不沒有如何獲得卡刪除通知在C#中。如何處理這些情況請讓我知道。存儲卡問題在Windows Mobile

感謝

回答

0

您可以使用功能SHChangeNotifyRegisterWM_FILECHANGEINFO消息。

訂閱後,您將收到帶有ID的事件,例如SHCNE_DRIVEREMOVEDSHCNE_MEDIAREMOVED,因此您可以在存儲卡被移除時觸發某些操作。

要使用壓縮框架中的原生函數,請使用P/Invoke。

+0

亞..多數民衆贊成的權利...我用這個.. 問題是我得到WM_FILECHANGEINFO消息我的窗口處理程序是用C++編寫的,它存在於一個DLL中,從DLL執行sendmessage,它會來windowproc我的形式.. 我沒有得到如何取出窗體windowproc和recive所有通知的形式只使用C++ dll代碼..請幫助我,如果你知道 – Naruto 2009-09-23 09:49:52

+0

我不知道你的方法可以避免本機C++代碼。 – MannyNS 2009-09-23 10:57:06

+0

首先,我們需要爲窗體創建窗口過程,使用API​​的「GetWindowLong」和「SetWindowLong」API, 設置新窗口過程,然後在.exe中創建一個虛擬表單並註冊WM_FILECHANGEINFO消息。當卡被刪除時,我會得到SHCNE_DRIVEREMOVED消息,然後殺死進程。 – Naruto 2009-10-21 05:01:07

1

看看這篇文章:(link)。搜索檢測可移動存儲設備的狀態。我認爲這是你正在尋找的。

+0

嘿它的OpenNetCF花花公子... 它不是免費的..我們需要它的源代碼..我們不會得到它.. 因爲我們需要支付...不,我不希望那... – Naruto 2009-09-23 09:01:58

+0

您可以免費使用社區Dll。你爲什麼關心源代碼? – Shaihi 2009-09-23 10:07:01

+0

如果我的應用程序安裝在存儲卡,然後我得到問題.. 生病拿出卡,隨着卡OpenNetCF DLL也出來了, 誰將在那裏通知我的應用程序,該設備被刪除..如何解決這個問題? – Naruto 2009-09-23 10:21:26

1

如果你不想使用OpenNETCF(不知道你爲什麼需要源代碼),你需要使用的API調用是RequestDeviceNotifications,並且你需要傳遞一個創建的msg隊列的句柄通過調用CreateMsqQueue。

文檔是here

您需要的P /從託管代碼中調用這些調用註冊的通知,然後等待一個事件的消息到達隊列。

3

既然你只是絕對要有源(就像你必須有它的精簡框架本身和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」還是在單獨的程序集中,這都是事實,因此您認爲必須爲此提供源代碼纔是錯誤的。

添加此修復程序肯定會降低錯誤出現的機會窗口,但由於機會仍然存在,並且由於墨菲定律肯定適用於軟件推出,您幾乎可以保證這仍然會發生在領域。

+0

非常感謝U .. 我會用它..謝謝Lot – Naruto 2009-09-23 15:56:23

0

如果您的應用程序安裝在用戶可移動存儲卡上,您只會在受傷的世界中結束。強烈警告或徹底禁止在可移動媒體上安裝。