小编Nic*_*haw的帖子

64位Windows中的SetWindowPos编译错误

我正在改变我们的代码库,使其在64位架构下进行编译.我必须做出的大部分改变是显而易见的,但这一次让我感到难过. SetWindowPos具有第二个参数,hWndInsertAfter即可以是一个窗口句柄,或预定义的值中的一个HWND_TOP,HWND_BOTTOM,HWND_TOPMOSTHWND_NOTOPMOST(见此处为MSDN信息).这些值在中定义WinUser.h.

在32位架构中,使用其中一个调用SetWindowPos工作正常,但在64位,编译器抱怨:

警告C4306:'type cast':从'int'转换为更大尺寸的'HWND'

这是因为#defines正在将[32位]整数转换为HWND,例如:

#define HWND_TOPMOST ((HWND)-1)

在没有编译器发出警告的情况下,我需要更改以在64位架构中进行编译?我可以使用#pragma warning( disable: 4306 )#define中的64位int 来禁用警告或使用我自己的定义,但是肯定有一种"正确"的Microsoft方法吗?

c winapi visual-studio-2012

7
推荐指数
1
解决办法
792
查看次数

日期/时间是SQL Server的datetimeoffset UTC还是本地的一部分?

根据微软关于datetimeoffset数据类型的页面(见这里):

时区偏移量指定时间或日期时间值与UTC的区域偏移量.

但是它没有说明datetimeoffset字符串文字格式的日期时间部分是否显示:

  • UTC时间,时区偏移量适用于到达本地时间的时间,或者;
  • localtime,时区偏移量是应用于返回UTC的时间.

这是datetimeoffset的字符串文字格式:YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+|-}hh:mm].

因此,我的问题是,是YYYY-MM-DD hh:mm:ss[.nnnnnnn]本地时间还是UTC中的字符串文字?

sql-server timezone sql-server-2008

6
推荐指数
1
解决办法
1489
查看次数

确保在销毁之前没有线程在关键部分上等待

我在使用关键部分时遇到了问题.我的应用程序有大量的线程,比如60,它们都需要访问全局资源.因此,我通过关键部分保护该资源.这在操作期间完美地工作,但是当我的应用程序关闭时,我触发线程退出,然后销毁关键部分.

如果其中一些线程在退出时等待临界区,则会出现问题,从而阻止它们自行退出.

我在窗口CriticalSection调用周围写了一个包装器,它有一个'Initialised'标志,我在创建暴击时设置为true,当我即将离开暴击时设置为false(两个案例都在内部设置)暴击).在'enter crit'包装函数尝试进入暴击之前检查此标志,如果标志为假则绕过请求.当任何线程成功进入暴击时,也会检查该标志,如果它是假的,它会立即离开暴击.

在删除暴击之前我要做的是将标志设置为false,然后等待任何等待的线程:被允许进入暴击; 看Initialised标志是false; 然后离开暴击(这应该是每个线程非常快速的操作).

我通过检查CRITICAL_SECTION结构中的LockCount来检查等待访问暴击的线程数,并等到它达到0(在XP中,那是LockCount - (RecursionCount-1);在2003服务器及以上,锁定计数是((-1) - (LockCount)) >> 2),然后我销毁关键部分.

应该足够了,但是当我还有一个线程(总是只有一个线程,永远不会更多)等待进入暴击时,我发现LockCount达到0,这意味着如果我在那个时候删除暴击,另一个线程随后会唤醒从等待暴击开始,并导致崩溃,因为那时CRITICAL_SECTION对象已被破坏.

如果我保持自己的内部锁定线程数等待访问,我有正确的计数; 然而这并不理想,因为我必须在暴击之外增加这个数量,这意味着价值不受保护,因此在任何时候都不能完全依赖.

有谁知道为什么CRITICAL_SECTION结构中的LockCount会被1除外?如果我使用自己的锁定计数,那么最后一个线程退出之后(在我销毁暴击之前)检查CRITICAL_SECTION的锁定计数,它仍然是0 ...

或者,除了关键部分之外,还有更好的方法来保护我的应用程序中的全局资源吗?

这是我的包装器结构:

typedef struct MY_CRIT {
    BOOL Initialised;
    CRITICAL_SECTION Crit;
    int MyLockCount;
}
Run Code Online (Sandbox Code Playgroud)

这是我的Crit init函数:

BOOL InitCrit( MY_CRIT *pCrit )
{
    if (pCrit)
    {
        InitializeCriticalSection( &pCrit->Crit );          
        pCrit->Initialised = TRUE;
        pCrit->MyLockCount = 0;
        return TRUE;
    }
    // else invalid pointer
    else    
        return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

这是我的输入暴击包装函数:

BOOL EnterCrit( MY_CRIT *pCrit )
{
    // if …
Run Code Online (Sandbox Code Playgroud)

c winapi critical-section

5
推荐指数
1
解决办法
2401
查看次数

无法在Windows 8上使用SetSystemTime设置时钟

我的应用程序用于SetSystemTime()从GPS源设置PC时钟.这在Windows 7中正常工作,禁用了用户帐户控制,但在Windows 8中,即使禁用了UAC,也会失败.我得到的错误是ERROR_PRIVILEGE_NOT_HELD.登录到计算机的用户位于Administrators组中.如果我从资源管理器中的文件上下文菜单中以"以管理员身份运行"运行应用程序,我只能使其工作 - 但登录用户是管理员.

那么......在Windows 8上我需要做些什么才能SetSysytemTime()开始工作?我是否需要比当前用户的管理员权限更高的权限?如果是这样,什么比管理员更高的特权?或者我是否需要以不同方式设置用户帐户以允许这些类型的呼叫在Windows 8上运行?

编辑:如评论中所述,手动尝试启用SE_SYSTEMTIME_NAME权限不起作用.也没有尝试使用建议的MSDN方法添加权限LsaAddAccountRights.

c winapi windows-8

5
推荐指数
1
解决办法
4727
查看次数