C# windows mobile中的存储卡问题

C# windows mobile中的存储卡问题,c#,.net,c++,windows-mobile,compact-framework,C#,.net,C++,Windows Mobile,Compact Framework,我正在制作windows mobile应用程序,它引用了一些DLL,但我这里有一些问题。 假设我的应用程序安装在与存储卡相关的DLL中,且仅存在于存储卡中, 如果我启动应用程序,它引用了一些DLL,现在我将移除存储卡,但我的应用程序仍将运行,它不会退出,它最终会导致我的移动设备重新启动。。 我确实得到了Deice卡删除通知,但它在DLL及其C++代码。如果卡被移除,则存储卡中不会出现DLL,我甚至不会在c中收到通知。我不知道如何在c中获得卡移除通知。如何处理这些情况,请让我知道 谢谢看看这篇文章

我正在制作windows mobile应用程序,它引用了一些DLL,但我这里有一些问题。 假设我的应用程序安装在与存储卡相关的DLL中,且仅存在于存储卡中, 如果我启动应用程序,它引用了一些DLL,现在我将移除存储卡,但我的应用程序仍将运行,它不会退出,它最终会导致我的移动设备重新启动。。 我确实得到了Deice卡删除通知,但它在DLL及其C++代码。如果卡被移除,则存储卡中不会出现DLL,我甚至不会在c中收到通知。我不知道如何在c中获得卡移除通知。如何处理这些情况,请让我知道


谢谢

看看这篇文章:()。搜索检测可移动存储设备状态的。我想这就是你要找的。

看看这篇文章:()。搜索检测可移动存储设备状态的。我认为这就是您要寻找的。

如果您不想使用OpenNETCF(不确定为什么需要源代码),您需要使用的API调用是RequestDeviceNotifications,您需要向它传递通过调用CreateMsqQueue创建的消息队列句柄

文件是


您需要从托管代码p/调用这些调用以注册通知,然后等待事件消息到达队列。

如果您不想使用OpenNETCF(不确定为什么需要源代码),则需要使用的API调用是RequestDeviceNotifications,您需要将通过调用CreateMsqQueue创建的消息队列句柄传递给它

文件是

您需要从托管代码中p/调用这些调用以注册通知,然后等待事件消息到达队列。

您可以使用该函数发送消息

订阅后,您将收到ID为的事件,例如
SHCNE\u DRIVEREMOVED
SHCNE\u MEDIAREMOVED
,因此您可以在卸下存储卡时触发一些操作

要使用compact框架中的本机函数,请使用p/Invoke。

您可以使用该函数发送消息

订阅后,您将收到ID为的事件,例如
SHCNE\u DRIVEREMOVED
SHCNE\u MEDIAREMOVED
,因此您可以在卸下存储卡时触发一些操作


要使用compact框架中的本机函数,请使用p/Invoke。

因为你必须拥有源代码(就像你必须拥有compact框架本身和操作系统的源代码一样),而且50美元似乎太高了,你无法获得SDF的源代码,所以我向你捐款。这是来自SDF代码库(对于任何想知道的人,我拥有它,所以我没有违反任何许可证):

可以使用检索队列指针(尽管它有在te 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,或者JITted代码已被pitched,并且当存储卡被拉出时,它的IL驻留在不在RAM中的页面中,则设备仍将呕吐。无论代码是“在”您运行的应用程序代码中还是在一个单独的程序集中,这都是正确的,因此您认为您必须拥有这方面的源代码是错误的


添加此修复程序肯定会减少bug出现的机会窗口,但由于机会仍然存在,而且墨菲定律肯定适用于软件的推出,因此您几乎可以保证这仍然会在现场发生。

因为您必须拥有源代码(就像Compact Framework本身和操作系统都必须拥有它一样)由于50美元似乎太高,您无法获得SDF的源代码,因此我向您捐款。这是来自SDF代码库的(对于任何想知道的人,我拥有它,所以我没有违反任何许可证):

可以使用检索队列指针(尽管它有已知的bug,这些bug在te SDF中已修复)。我不发布SDF实现,因为它对于post来说太长了

在这一点上,它变得如此简单:

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,或者JITted代码已经被pitted,并且当取出存储卡时,它的IL驻留在RAM中不存在的页面中,那么设备仍然会呕吐。无论代码是否在内存中,这都是正确的您正在运行应用程序代码或在一个单独的程序集中运行,因此您认为您必须拥有这方面的源代码是错误的


添加此修复程序肯定会减少漏洞出现的机会窗口,但由于机会仍然存在,而且墨菲定律肯定适用于软件的推出,您几乎可以保证这仍然会在现场发生。

如果您将应用程序安装在用户可移动存储卡上,您将只需在一个充满伤害的世界中发现。强烈警告或完全禁止在可移动媒体上安装。

如果你的应用程序安装在用户可移动存储卡上,你将在一个充满伤害的世界中结束。强烈警告或完全禁止在可移动媒体上安装。

嘿,它的OpenNetCF dude…它不是免费的。我们需要