互操作保护内存验证

时间:2010-01-07 13:48:35

标签: c# c interop

我有一个用C编写的DLL,我必须使用它。 没关系,但在一个地方我收到了错误。

int getHourTime() 
{
   struct tm *psttm;

   time_t timet = //is initialzed correctly

   psttm = localtime(&timet);

   int nHour = psttm->tm_hour;

   return nHour;
}

我使用DLLImport在C#中调用它。 上线:“psttm-> tm_hour”我得到一个错误(抛出)“试图读取或写入受保护的内存”。我明白这是因为它返回一个指向struct tm内部位置的指针,但我该如何解决呢?

由于

4 个答案:

答案 0 :(得分:1)

问题是因为下一行:

struct tm * psttm;

它没有初始化为NULL。

答案 1 :(得分:0)

我不太确定在这种情况下发生了什么,因为localtime返回一个指向静态分配内存的指针。非常糟糕的事情(tm)必须正在进行localtime才能返回错误的指针。现在,如果您的timet结构具有错误值,则MSDN会声明将返回NULL值。

我认为你的应用程序中存在已经破坏的内存。

以下是否有效:

int getHourTime()
{
    struct tm *psttm = NULL;
    time_t timet;

    time(&timet);
    psttm = localtime(&timet);

    int nHour = psttm->tm_hour;
    return nHour;
}

答案 2 :(得分:0)

int getHourTime() 
{
   struct tm *psttm;

   time_t timet = //is initialzed coorectly

   // what is psstm?  Set a breakpoint on this line and look at it
   // before and after executing localtime()
   psttm = localtime(&timet);

   // if it's non-null then you can also do this:
#if _DEBUG
   if (!HeapValidate(GetProcessHeap(), HEAP_NO_SERIALIZE, psttm)) {
       puts("bad ptr in getHourTime");
   }
#endif
   int nHour = psttm->tm_hour;

   return nHour;
}

答案 3 :(得分:0)

这对我有用:

time_t StartTime = time(NULL);
struct tm * StartLocalTime = localtime(&StartTime);
int hour = StartLocalTime->tm_hour;

如果这不起作用,可能你的代码中的其他地方有一些缓冲区溢出,它只是在这个函数中表现出来。