проверка взаимодействия с защитой памяти - PullRequest
1 голос
/ 07 января 2010

У меня есть DLL, написанная на C, которую я должен использовать. Это нормально, но в одном месте я получаю ошибку.

int getHourTime() 
{
   struct tm *psttm;

   time_t timet = //is initialzed correctly

   psttm = localtime(&timet);

   int nHour = psttm->tm_hour;

   return nHour;
}

Я звоню в C #, используя DLLImport. При получении строки: «psttm-> tm_hour» я получаю ошибку (throw), что «Попытка чтения или записи в защищенную память». Я понимаю, что это потому, что он возвращает указатель на внутреннее место struct tm, но как я могу решить это?

Спасибо

Ответы [ 4 ]

1 голос
/ 21 января 2010

Проблемы были из-за следующей строки:

struct tm * psttm;

Он не был инициализирован в NULL.

0 голосов
/ 07 января 2010
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;
}
0 голосов
/ 07 января 2010

Это сработало для меня:

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

Если это не сработает, вероятно, у вас есть какой-то переполнение буфера где-то еще в вашем коде, и это просто проявляется внутри этой функции.

0 голосов
/ 07 января 2010

Я не совсем уверен, что происходит в этом случае, так как 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...