访问模块'executable.exe'中的地址违规。读取地址

时间:2011-07-10 22:48:23

标签: c++builder access-violation

我在网上看到了“访问违规”的一些问题,但这对我来说非常奇怪

我测试了一些“解决方案”但没有结果

这是一段代码:

TDateTime CFileVersionInfo::GetFileDate() const
{
    FILETIME local;
    SYSTEMTIME st;
    TDateTime res;

    FILETIME    ft;
    ft.dwLowDateTime = m_FileInfo.dwFileDateLS;
    ft.dwHighDateTime = m_FileInfo.dwFileDateMS;

    FileTimeToLocalFileTime(&ft, &local);
    FileTimeToSystemTime(&local, &st) ;
    //GetLocalTime(st);
    res = SystemTimeToDateTime(st) ;

    return res;
}

我可以毫无问题地制作或构建程序,但是当我运行程序时,它会向我显示访问冲突错误,如果我评论该功能:

// TDateTime dateTime = fvi.GetFileDate();

程序运行完美

我不是C ++专业人士我只是想制作一个供个人使用的程序,所以我向专家提出这个问题

修改

我已经解决了问题

TDateTime CFileVersionInfo::GetFileDate() const
{
    _FILETIME local;
    _SYSTEMTIME st;
    TDateTime res;

    FILETIME    ft;
    ft.dwLowDateTime = m_FileInfo.dwFileDateLS;
    ft.dwHighDateTime = m_FileInfo.dwFileDateMS;

    FileTimeToLocalFileTime(&ft, &local);
    FileTimeToSystemTime(&local, &st) ;
    GetLocalTime(&st);           // <-- This is the solution.. for now...
    res = SystemTimeToDateTime(st) ;

    return res;
}

2 个答案:

答案 0 :(得分:1)

您没有进行任何错误检查以确保API转换成功,因此您可能正在尝试转换垃圾数据。始终检查错误,例如:

TDateTime CFileVersionInfo::GetFileDate() const
{
    FILETIME local;
    SYSTEMTIME st;

    FILETIME ft;
    ft.dwLowDateTime = m_FileInfo.dwFileDateLS;
    ft.dwHighDateTime = m_FileInfo.dwFileDateMS;

    if( FileTimeToLocalFileTime(&ft, &local) )
    {
        if( FileTimeToSystemTime(&local, &st) )
            return SystemTimeToDateTime(st);
    }

    return 0.0;
}

答案 1 :(得分:1)

我已经解决了问题

TDateTime CFileVersionInfo::GetFileDate() const
{
    _FILETIME local;
    _SYSTEMTIME st;
    TDateTime res;

    FILETIME    ft;
    ft.dwLowDateTime = m_FileInfo.dwFileDateLS;
    ft.dwHighDateTime = m_FileInfo.dwFileDateMS;

    FileTimeToLocalFileTime(&ft, &local);
    FileTimeToSystemTime(&local, &st) ;
    GetLocalTime(&st);           // <-- This is the solution.. for now...
    res = SystemTimeToDateTime(st) ;

    return res;
}