我有一个程序需要在安装时在My Document目录中创建文件.这是一个严格的固定要求,没有改变这一点.问题是,如果用户不"以管理员身份运行"的安装文件,innosetups恒{}用户文档指向的管理员文档目录不是原来的登录的用户.
所以,谷歌搜索并发现:
通过Windows Vista/7上的Inno Setup将文件安装到原始用户的My Docs文件夹
答案是错误的,因为innosetup甚至说明了这一点
如果用户通过右键单击其EXE文件并选择"以管理员身份运行"来启动安装程序,则不幸的是,此标志将不起作用,因为安装程序无法使用原始用户凭据运行任何代码.如果从已经提升的进程启动安装程序,情况也是如此.但请注意,这不是Inno Setup特定的限制; 在这种情况下,基于Windows Installer的安装程序无法返回到原始用户凭据.
我想我可以鼓励用户不要使用Run As Administrator,但我不知道如何防止他进入高架.
我想在第一次运行时(安装后)可能让程序本身设置了My Documents\Program name目录.这种解决方法有效吗?它必须从其程序文件目录中复制文件作为可能受限的用户.是否有可能或者我会遇到priveleges问题?
我有一个关于如何构建与 GUI 对象相关的代码的问题。假设我有一个对话框,它有一个列表控件,该控件有一堆从数据库中获取的名称。用户可以编辑名称。逻辑是驻留在该对话框类中还是应该来自外部。为了说明我的意思,这里有一些伪代码显示了在对话框类之外处理逻辑时的代码结构:
NamesDialog : wxDialog
{
Private:
..stuff..
Public:
...
SetNames(wxStringArray names);
wxStringArray GetNames();
..stuff..
}
Run Code Online (Sandbox Code Playgroud)
因此,该类的用户会执行以下操作:
wxStringArray names = DatabaseManager::Get()->GetNames();
names.Sort();
NamesDialogObject.SetNames(names);
NamesDialogObject.ShowModal();
wxStringArray modified_names = NamesDialogObject.GetNames();
AddToDatabase(modified_names); //or something like this.
Run Code Online (Sandbox Code Playgroud)
另一方面,数据库逻辑可以驻留在NamesDialog 类本身中。在 show 方法中,我可以查询数据库的名称,并且当用户与控件(在本例中为列表控件)交互时,可以从事件处理程序更新数据库。因此 NamesDialog 类只有 Show() 方法,因为不需要使用 SetNames 或 GetNames() 等。
通常首选哪种方法?我没有太多的工作经验,所以我不确定哪种是处理它的正确方法。有时,处理类中的所有内容更容易,但访问与之交互的对象可能具有挑战性。通常可以通过让相关对象像上面示例中的数据库管理器一样成为单例来实现。
我有一个包含对象指针向量的类.我在该类中有一个GetObject(..)函数,它通过向量查找,找到所需的对象,并返回指向它的指针.但是,如果该类的用户对该返回的指针执行了delete(),则我的程序将崩溃,因为该向量仍然具有指向该对象的指针,该对象现在是无效的.因此,在我的GetObject()类中,我可以返回一个const指针,但这并不能解决问题,因为您仍然可以删除该对象.该对象是可变的,所以我不能返回指向const对象的指针.我想我可以通过返回对象的引用来阻止删除但是如果有错误我的函数返回NULL.我想我可以通过参数传回对象引用,然后像这样返回和错误号
//-1 on object on found. 0 for success. Object is passed back in
// the function parameter result.
int MyObject::GetObject(int object_id, Item& result)
Run Code Online (Sandbox Code Playgroud)
对于这种情况,这是最好的解决方案吗?