我有一个服务正在运行,并希望访问常见的用户文件夹,如启动.为此我想扩展环境变量,如%APPDATA%系统上的每个用户(包括注销).我可以获取登录用户的会话ID并从中创建令牌然后调用ExpandEnvironmentStringsForUser().但是注销用户呢.对他们来说不会是会话.我唯一可以得到的就是帐户名(使用NetUserEnum()或NetQueryDisplayInformation())和来自注册表的SID(HKLM\software\Microst\Windows NT\current Version\Profile List)我可以从SID获取用户令牌还是冒充用户使用SID,或者是否有某种方法可以使用SID扩展环境变量.
编辑:我需要从所有用户的启动位置删除一些文件.为此我需要扩展%APPDATA%并%USERPROFILE%在每个用户的上下文中,无论是否登录.
编辑2:问题归结为扩展环境变量,例如%APPDATA%针对不同用户,而没有给该用户的令牌.
Scott meyers 在 Effective C++ 的第 3 项中说
将 decltype 应用于名称会产生该名称的声明类型。名称通常是左值表达式,但这不会影响 decltype 的行为。然而,对于比名称更复杂的左值表达式,decltype 通常确保报告的类型是左值引用。也就是说,如果除名称之外的左值表达式具有类型 T,则 decltype 将该类型报告为 T&。这很少有任何影响,因为大多数左值表达式的类型固有地包含左值引用限定符。例如,返回左值的函数总是返回左值引用。
他说的函数返回左值,例如,总是返回左值引用是什么意思
struct Data
{
...
CRITICAL_SECTION valLock;
}
std::map<int, Data> mp;
CRITICAL_SECTION mpLock;
Run Code Online (Sandbox Code Playgroud)
我目前正在使用两个关键部分来确保该线程安全。
我必须锁定两者map并Data更新Data
//Lock mpLock
//Lock mp[key1].valLock
mp[key1].something = something_new;
//unlock mp[key1].valLock
//unlock mpLock
Run Code Online (Sandbox Code Playgroud)
我研究了英特尔的并发哈希图,它不需要两个锁并在内部处理这个问题。如果我不想使用英特尔的tbb,还有其他方法吗?我只有支持。不过c++ 98可以使用。boost调查过boost::shared_mutex,但无法关联如何在当前场景中使用它。
编辑:容器上的锁真的需要吗?我不能用来Data::valLock读/写Data。任何插入mp都不会影响现有的迭代器,因此不需要锁。任何删除mp都会以 开头Data::valLock。这里可能会错过什么情况?
编辑2:
UpdateThread()
{
//Lock mp[key].valLock
mp[key].a = b; //Line 1
//unlock mp[key].valLock
}
ReadThread()
{
//Lock mp[key].valLock
something = mp[key].a; //Line 2
//unlock mp[key].valLock
}
Run Code Online (Sandbox Code Playgroud)
所以我认为只有当第 1 行完成(或反之亦然)即已mp更新(以及地图内部结构)时,第 …
在使用 Windows dll 时,我们应该限制 dll 边界内的内存分配/释放,因为 dll 可能使用自己的堆。所以我们有从 dll 导出分配器和自由函数。
IsomeInterface* getObject();
void freeObject(IsomeInterface *object);
Run Code Online (Sandbox Code Playgroud)
这样,对象的创建和删除将驻留在 dll 中。
linux上的共享库是否也存在这个问题?在处理共享库 (.so) 时,我们是否还需要注意在共享库中保持分配/解除分配。我在下面做了一些快速试用,它适用于 linux。相同的示例不适用于 windows dll(如果 exe 和 dll 都使用 /MD 编译以使用相同的堆,它将适用于 windows dll)。
std::vector<int> vec;
vec.push_back(42);
PassAVector(vec);
Run Code Online (Sandbox Code Playgroud)
其中PassAVector驻留在共享库
void PassAVector(std::vector<int> &vec)
{
vec.push_back(1); // These would cause reallocation
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
}
Run Code Online (Sandbox Code Playgroud)
这是否意味着 unix 上的共享库与可执行文件共享堆(相当于 Windows 上的 /MD 开关)?
是否可以在 linux 上编译(某些编译器标志)共享库 (.so) 或可执行文件,以便它们开始使用不同的堆(Windows 上的 /MT 开关)并且这个问题浮出水面?
编辑:发现这似乎表明只要编译器是 gcc,就可以跨边界传递 STL。
在Windows 10上,需要访问网络摄像头的应用程序,与之通信frame server的服务进行通信svchost.
我过滤掉了网络摄像头流和我得到的进程ID svchost.我想确定使用网络摄像头的实际过程.
有没有明确的方法来以编程方式识别使用网络摄像头的实际应用程序是什么?我已经研究了枚举进程的句柄(也必须处理NtQueryObject()挂起),但我正在寻找更好的解决方案.
我有一个界面ver作为
// ver.h
class ver
{
public:
virtual void func()=0;
};
Run Code Online (Sandbox Code Playgroud)
然后ver1和ver2实现此接口.ver1并且ver2它们包括标题test\header.h和test2\header.h.现在test\header.h并且test2\header.h不在我的控制之下,并且除了函数指针之外大部分都是相似的,这是使用ver1和的原因ver2
// test\header.h
#ifndef header
#define header
typedef void
(*FuncPoint)(
struct_type_a
);
#endif
Run Code Online (Sandbox Code Playgroud)
和
// test2\header.h
#ifndef header
#define header
typedef void
(*FuncPoint)(
struct_type_b
);
#endif
Run Code Online (Sandbox Code Playgroud)
现在实现
//ver1.h
#include "test\header.h"
class ver1:public ver
{
public:
FuncPoint f;
};
Run Code Online (Sandbox Code Playgroud)
和
//ver2.h
#include "test2\header.h"
class ver2:public ver
{
public:
FuncPoint …Run Code Online (Sandbox Code Playgroud) 我有一个函数foo(),它获取了critical section一些处理并释放了critical section.现在有多个控制流,所以为了避免记住释放锁我想把它包装在一个类中,这样析构函数就会自动释放锁.
class Lock
{
public:
LPCRITICAL_SECTION m_a;
Lock(CRITICAL_SECTION *a):m_a(a){EnterCriticalSection(a);}
~Lock(){LeaveCriticalSection(m_a);}
};
Run Code Online (Sandbox Code Playgroud)
现在的问题是,我有控制流,我想获取锁,做一些事情,然后释放它,然后继续其他处理.所以我不想等待释放锁,直到功能结束时,破坏将踢in.Is有办法实现这一目标.