Windows 10上的WSL允许通过bash.exe执行Linux命令和命令行工具.非常有用的是,可以从Windows命令行(cmd.exe
)调用Linux工具/命令,方法是将其作为参数传递给bash.exe,如下所示:
bash.exe -c <linux command>
Run Code Online (Sandbox Code Playgroud)
这非常有用,因为它应该允许基于Windows的脚本无缝地组合Windows和Linux工具.
不幸的是,我无法从R脚本调用Linux命令(见下文).
0)系统
安装了Win10 x64 +周年纪念更新+ WSL
1)调用Linux命令的比较情况
以下一切都适合我; 这里显示的只是一个示例调用ls
.
从Windows命令行(cmd.exe提示符)
bash -c "ls /mnt/a"
Run Code Online (Sandbox Code Playgroud)
bash -c "ls /mnt/a > /mnt/a/test.txt"
Run Code Online (Sandbox Code Playgroud)同样的工作,如果从...开始 WinKey + R
同样可以在.bat
文件中使用.
它可以从编译的代码中调用.我尝试使用Delphi XE2 32位和64位使用ShellExecute
:
例如,这些工作(32位和64位):
ShellExecute (0, PChar('open'), PChar('cmd.exe'), PChar('/c c:\windows\system32\bash.exe -c "ls /mnt/a > /mnt/a/test.txt"'), nil, SW_SHOWNORMAL);
Run Code Online (Sandbox Code Playgroud)
或(32位代码):
ShellExecute (0, PChar('open'), PChar('c:\windows\sysnative\bash.exe'), PChar('-c "ls /mnt/a > /mnt/a/test.txt"'), nil, SW_SHOWNORMAL);
Run Code Online (Sandbox Code Playgroud)
或(64位代码):
ShellExecute (0, PChar('open'), PChar('c:\windows\system32\bash.exe'), PChar('-c "ls /mnt/a > /mnt/a/test.txt"'), nil, …
Run Code Online (Sandbox Code Playgroud)Delphi 2010中不存在单元中的IDeveloperConsoleMessageReceiver
接口MSHTML.pas
,但(可能)存在于更新版本中,因为它是最近的功能.
我想手动声明此接口,但仅限于它尚不存在.
如何测试是否声明了此接口?
像"假"代码:
{$IFNDEF "IDeveloperConsoleMessageReceiver"}
type
IDeveloperConsoleMessageReceiver = interface ...
{$ENDIF}
Run Code Online (Sandbox Code Playgroud) 考虑在具有以下类型对齐方式的x64位Windows操作系统上工作:
据我了解,做这样的事情非常不好:
struct X_chaotic
{
bool flag1;
double d1;
bool flag2;
double d2;
bool flag3;
double d3;
//... and so on ...
};
Run Code Online (Sandbox Code Playgroud)
根据C ++对齐,缓存行和最佳实践 以及数据结构对齐,编写此代码应该更好/更快并且更紧凑:
struct X_alignOrder
{
double d1;
double d2;
double d3;
//... all other doubles ...
bool flag1;
bool flag2;
bool flag3;
//... all other bools ...
};
Run Code Online (Sandbox Code Playgroud)
成员以比对大小的顺序声明,从最高比对开始。
可以肯定地说按对齐大小对数据成员的声明进行排序是个好主意吗?您会说这是最佳做法吗?还是没有区别?
(由于C ++标准,我听说编译器无法重新排列定义的顺序,这甚至适用于在类的访问说明符块中声明的所有数据成员)
因为我从没读过这本书,所以无论是在Scott Meyers的书还是Bjarne Stroustrup的书中,我都不知道应该为我的日常工作重新排列数据声明的顺序。
MSDN表示使用ReadDirectoryChangesW意味着调用进程具有备份和还原权限.
这是否意味着只有在管理员帐户下启动的流程才能正常运行?
我尝试了以下代码,它在作为受限用户运行时无法启用所需的权限.
void enablePrivileges()
{
enablePrivilege(SE_BACKUP_NAME);
enablePrivilege(SE_RESTORE_NAME);
}
void enablePrivilege(LPCTSTR name)
{
HANDLE hToken;
DWORD status;
if (::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES tp = { 1 };
if( ::LookupPrivilegeValue(NULL, name, &tp.Privileges[0].Luid) )
{
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL result = ::AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
verify (result != FALSE);
status = ::GetLastError();
}
::CloseHandle(hToken);
}
}
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?是否有从非管理员用户帐户使用ReadDirectoryChangesW的解决方法?似乎.NET的FileSystemWatcher可以做到这一点.谢谢!
更新:这是该类的完整代码:
class DirectoryChangesWatcher
{
public:
DirectoryChangesWatcher(wstring directory)
{
enablePrivileges();
hDir = ::CreateFile(directory.c_str(),
FILE_LIST_DIRECTORY | FILE_FLAG_OVERLAPPED,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, …
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,从二进制日志文件加载记录,并在虚拟TListView中显示它们.文件中可能有数百万条记录,用户可以过滤显示,因此我不会一次加载内存中的所有记录,并且ListView项目索引不是一对一的关系.文件记录偏移(例如,列表项1可以是文件记录100).我使用ListView的OnDataHint事件来加载ListView实际感兴趣的项目的记录.当用户滚动时,OnDataHint指定的范围发生变化,允许我释放不在新范围内的记录,并分配新记录如所须.
这样工作正常,速度可以忍受,并且内存占用非常低.
我目前正在评估TVirtualStringTree作为TListView的替代品,主要是因为我想添加扩展/折叠跨越多行的记录的能力(我可以通过动态递增/递减项目计数来使用TListView来捏造它,但这不是像使用真正的树一样直接).
在大多数情况下,我已经能够移植TListView逻辑并让一切工作正常.我注意到TVirtualStringTree的虚拟范例有很大的不同.它没有与TListView相同的OnDataHint功能(我可以使用OnScroll事件伪造它,这允许我的内存缓冲逻辑继续工作),我可以使用OnInitializeNode事件将节点与分配的记录相关联.
但是,一旦树节点初始化,它就会看到它在树的生命周期内保持初始化状态.这对我不好.当用户滚动并从内存中删除记录时,我需要重置那些非可视节点,而不是完全从树中删除它们,或者丢失它们的展开/折叠状态.当用户将它们滚动回视图时,我可以重新分配记录并重新初始化节点.基本上,就虚拟化而言,我希望尽可能使TVirtualStringTree像TListView一样.
我已经看到TVirtualStringTree有一个ResetNode()方法,但每次尝试使用它时都会遇到各种错误.我一定是错了.我还想过将每个节点内的数据指针存储到我的记录缓冲区中,然后分配并释放内存,相应地更新这些指针.最终效果也不是很好.
更糟糕的是,我最大的测试日志文件中有大约500万条记录.如果我一次初始化具有那么多节点的TVirtualStringTree(当日志显示未经过滤时),那么树的内部开销就会占用高达260MB的内存(还没有分配任何记录).而使用TListView,加载相同的日志文件及其背后的所有内存逻辑,我可以使用几个MB.
有任何想法吗?
我想myscheme://foo
通过我的应用程序像在任何浏览器中一样处理查询myscheme.exe
。
据我了解,解决方案将取决于所使用操作系统的版本。对于旧操作系统(直到 Windows 7),只需将记录保存在注册表中:
HKEY_CLASSES_ROOT
myscheme
(Default) = "URL:Myscheme Protocol"
URL Protocol = ""
DefaultIcon
(Default) = "myscheme.exe,1"
shell
open
command
(Default) = "C:\Program Files\Myscheme\myscheme.exe" "%1"
Run Code Online (Sandbox Code Playgroud)
不幸的是,将应用程序注册到 URI 方案声明这种方式已被弃用。我不应该再使用这个 API。页面上的推荐版本microsoft-edge
(它不包含有关它的信息)!!!
于是,我开始研究它windows 8
。我遇到了文件类型和 URI 关联模型,它说在Windows 8
应用程序中不再能够以编程方式将自己设置为文件类型或 URI 的默认处理程序。据我所知,新架构使用通知系统,用户通过特殊提示控制默认应用程序。但是默认程序说它对 Windows 10 不再有效(探索参考已经死了!)。
那么,如何在 Windows 10 中正确处理自定义协议呢?不幸的是,Windows 的文档很糟糕。那么不同版本的操作系统呢?我应该对不同的版本使用不同的技术吗?
PS请不要将此问题标记为重复。其他问题,例如如何在 Windows 中注册自定义 URL 协议?,如何创建自己的 URL 协议?(例如:so://...)提出已弃用的解决方案。
对不起,我的英语不好。
我有一些从脚本生成的文件,这些文件提供了有关各种计算机的信息。txt文件采用UTF-8,但是只有一行采用UTF-16格式。我应该如何从文件中读取这一行?
PS我正在尝试编写一个程序来解析所有这些文件,并将它们重新编译为一个集合的.csv文件。
我尝试使用bufferedReader
和读取文件Scanner
,但是这一行是我遇到的唯一麻烦。我在网上找到的大多数用于读取UTF-16的代码都用于整个文件,而在UTF-16中并不完全。
//在记事本中打开该行时的外观。
序列号5 CG 8 XXXXXX
//在Notepad ++中打开该行时的外观,每个字符之间都有“ nul”值。
序列号 5 CG 8 XXXXXX
我的代码可以提取字符串的一部分,但是它的格式是多行,而Java无法识别每个字母或数字之间的字符。
#include <iostream>
using namespace std;
int main() {
int arr[5] = {5, 8, 1, 3, 6};
int len = *(&arr + 1) - arr;
cout << "The length of the array is: " << len;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于上面的代码,我不太明白这两段代码是做什么的:
*(&arr + 1)
Run Code Online (Sandbox Code Playgroud)
和
*(&arr)
&arr
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?因为当我运行以下两个代码时,我得到以下相同的输出:
&arr
(我认为这指向arr的第一个元素的地址)
*(&arr)
那么我不太明白这是做什么的,符号*
对&arr
(即这里的地址)有什么作用?,因为当我运行它们时,两个输出是相同的
最后,当一个整数说 1 被这里的代码添加到地址时,到底发生了什么:
&arr + 1
C++20 引入了DefaultConstructible
lambda。然而,cppreference.com 声明这仅适用于无状态 lambda:
如果未指定捕获,则闭包类型具有默认的默认构造函数。否则,它没有默认构造函数(这包括存在捕获默认值的情况,即使它实际上没有捕获任何内容)。
为什么这不扩展到捕获事物的 lambda DefaultConstructible
?例如,为什么不能[p{std::make_unique<int>(0)}](){ return p.get(); }
,DefaultConstructible
被俘者p
会在哪里nullptr
?
编辑:对于那些问我们为什么想要这个的人来说,这种行为看起来很自然,因为在调用要求函子可默认构造的标准算法时被迫编写这样的东西:
struct S{
S() = default;
int* operator()() const { return p.get(); }
std::unique_ptr<int> p;
};
Run Code Online (Sandbox Code Playgroud)
所以,我们可以传入S{std::make_unique<int>(0)}
,它会做同样的事情。
似乎能够编写[p{std::make_unique<int>(0)}](){ return p.get(); }
而不是创建一个执行相同操作的结构要好得多。
C++20之后会std::remove_cvref
取代吗?std::decay
从这个链接,我无法理解这意味着什么:
C++20 将具有一个新特征
std::remove_cvref
,不会对std::decay
数组产生不良影响
有何不良影响std::decay
?
请举例和解释!