尝试将文件复制到具有特定权限的文件夹时遇到问题。
这是我非常简单的测试程序:
#include <iostream>
#include <windows.h>
int main()
{
if(CopyFileA("D:/SOURCE/File.txt", "D:/LOCKED/dst1.txt", TRUE))
std::cout << "OK\n";
else
std::cout << "Fail\n";
if (CopyFileA("D:/SOURCE/File.txt", "D:/LOCKED/dst2.txt", TRUE))
std::cout << "OK\n";
else
std::cout << "Fail\n";
system("PAUSE");
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
Fail
OK
Run Code Online (Sandbox Code Playgroud)
我可以复制任意数量的文件。对于每次运行,第一次总是失败,后续总是成功。错误是 ERROR_ACCESS_DENIED。
这是重要的细节:我的目标文件夹具有受限的权限,只有当我删除“写入属性”或“写入扩展属性”时才会出现此行为。

我使用了 sysInternals 的进程监视器:没有其他进程正在访问源文件和目标文件。但是,目标文件上的行为并不相似。第一次尝试关闭文件并尝试重新打开它。以下是日志:
| 行动 | 地位 | 细节 |
|---|---|---|
| 失败的尝试(第一次) | —— | —— |
| 创建文件 | 成功 | 所需访问:通用读/写、删除、写 DAC、处置:创建、选项:顺序访问、非目录文件、属性:A、ShareMode:无、AllocationSize:0、OpenResult:已创建 |
| 关闭文件 | 成功 | |
| 创建文件 | 拒绝访问 | 所需访问:通用读/写、删除、写 DAC、处置:OpenIf、选项:顺序访问、同步 IO 非警报、非目录文件、属性:A、共享模式:无、分配大小:0 |
| 创建文件 | 拒绝访问 | 所需访问:通用读/写、删除、写 DAC、处置:OpenIf、选项:顺序访问、同步 IO 非警报、非目录文件、属性:A、共享模式:读、写、分配大小:0 |
| 创建文件 | 拒绝访问 | 所需访问:通用读/写、写 DAC、处置:OpenIf、选项:顺序访问、同步 IO 非警报、非目录文件、属性:A、共享模式:读、写、分配大小:0 |
| 创建文件 | 拒绝访问 | 所需访问:通用读/写,处置:OpenIf,选项:顺序访问,同步 IO 非警报,非目录文件,属性:A,共享模式:无,分配大小:0 |
| 创建文件 | 拒绝访问 | 所需访问:通用读/写,处置:OpenIf,选项:顺序访问,同步 IO … |
我有一个安装包(基于MSI),它试图注册一个dll文件,用作Windows资源管理器栏(Internet Explorer工具栏).
自定义操作定义如下:
[SystemFolder]\regsvr32.exe /s "pathtodllhere"
Run Code Online (Sandbox Code Playgroud)
MSI日志输出:
CustomAction SystemFolder_2返回实际的错误代码5.错误1722.此Windows Installer程序包有问题.作为设置的一部分运行的程序没有按预期完成.操作SystemFolder_2,位置:C:\ Windows\SysWOW64 \,命令:regsvr32.exe/s"C:\ Program Files(x86)\ Test Install\test.dll"
MSI(s)(10:F4):产品:测试安装 - 错误1722.此Windows Installer程序包存在问题.作为设置的一部分运行的程序没有按预期完成.操作SystemFolder_2,位置:C:\ Windows\SysWOW64 \,命令:regsvr32.exe/s"C:\ Program Files(x86)\ Test Install\test.dll"
到目前为止,我的测试/想法的简要说明:
希望我在这里展示我的研究,不要浪费任何人的时间!
这是在具有参考字段的类上放置 new的答案的后续。
调用std::vector<A>::data()上型A具有参考或常量字段,将指针返回到对象可通过原始向量通过放置新的,这将导致一个的const或参考场来改变原始对象将被替换,而仍然被另一指针管理,通过调用返回data()。
例如:
struct A {
const int i = 0;
};
int main() {
std::vector<A> vec = {{1}, {2}};
auto ptr = vec.data();
std::cout << ptr[1].i << std::endl; // 2
vec.pop_back();
vec.push_back({3}); // placement new, inside
std::cout << ptr[1].i << std::endl; // 3
}
Run Code Online (Sandbox Code Playgroud)
C++17 试图通过引入来解决这些问题,std::launder但后来同意虽然std::launder可以解决其他问题,但它并没有真正解决上述用例的问题,如NB US042 中所述。
一些问题 - 对于C++20 之前的C++ 版本:
由于NB US042 …
是否可以模拟Windows Installer?我想在安装过程中为各种场景设置测试.我并不关心Windows Installer数据库中存储的内容,我只想测试安装程序包的输出(更改了哪些文件等).
编辑
我想我可以设置VMWare图像并编写脚本.有人知道如何在VMWare实例中编写脚本/自动化任务吗?
刚刚获得了我正在尝试运行的安装项目的源文件,我收到此警告:
警告:在路径'c:\ Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper \'中找不到先决条件'Windows Installer 4.5'
我检查,当然没有4.5安装程序的文件夹,如警告中所述.我谷歌并发现我无法单独下载它,但据称它包含在Visual Studio发行版中.
嗯......我正在运行VS 2008而且它不在那里.我还查看了我最近安装VS 2008 express的另一台计算机,它也不存在.
谁知道我能在哪里得到它?
我想将 Firebase ml-kit 的 Java/Kotlin 实现移植到 C++,以便在 PC 上进行测试。我想它一定是一些 TensorFlow Lite 模型,我应该能够从官方的 TensorFlow 源代码中调整来使用它。
但是人脸检测模型在哪里?这三个模型@ https://github.com/firebase/quickstart-android/tree/master/mlkit/app/src/main/assets 似乎是分类模型。
以及如何解析结果以获得面部轮廓和面部标志点?
我现在检查了几天,但在 C++ 中没有看到类似的东西。
我正在编写一个C#windows服务,我能够在Visual Studio中安装和卸载,然后不确定我在代码中做了什么,搞砸了.现在当我尝试安装时,我收到错误1001:
The specified service already exists.
Run Code Online (Sandbox Code Playgroud)
但是当我尝试卸载时,它给了我:
Another program is being installed. Please wait until that installation is complete, and then try installing this software again.
Run Code Online (Sandbox Code Playgroud)
我确实看到我的服务仍列在服务中.我该怎么做才能解决这个问题?
当我netstat -a |find /C $portNumber在命令提示符下执行时,我得到给定端口号存在的总行数.
我想在任何变量中获得相同的计数,以便我可以检查NSIS中的端口是否已被占用或空闲.
我正在排除下面的命令,我尝试了很多方面,但是我无法在变量或堆栈中获得ExecDos :: exec的输出.
ExecDos::exec "netstat -a |find /C '$portNumber'| $output"
Run Code Online (Sandbox Code Playgroud) 我需要创建一个单一的Windows安装程序,当它在目标m/c上运行时执行以下任务:
C:\Windows\sysWoW64文件夹和存储中存储32位和64位log4cxx.dll库C:\Windows\system32目前,我正在使用WiX创建一个安装程序,我现在可以注册32位或64位安装程序但不能同时注册.不幸的是,我没有选择分离32位和64位安装程序,因为我需要在64位计算机上注册这两个安装程序.
我想知道是否有办法在一个安装程序中注册这两个DLL.提前致谢.
我想像 Adobe Photoshop 一样应用不清晰的蒙版,我知道这个答案,但它不如 Photoshop 清晰。
Photoshop 在 Smart Sharpen 对话框中有 3 个参数:Amount、Radius、Reduce Noise;我想实现所有这些。

根据 SO 中的各种来源,这是我编写的代码。但是在某些阶段(“blurred”、“unsharpMask”、“highContrast”)结果很好,但在最后阶段(“retval”)结果不好。
我哪里错了,我应该改进什么?
是否可以在性能方面改进以下算法?
#include "opencv2/opencv.hpp"
#include "fstream"
#include "iostream"
#include <chrono>
using namespace std;
using namespace cv;
// from https://docs.opencv.org/3.4/d3/dc1/tutorial_basic_linear_transform.html
void increaseContrast(Mat img, Mat* dst, int amountPercent)
{
*dst = img.clone();
double alpha = amountPercent / 100.0;
*dst *= alpha;
}
// from /sf/answers/41737041/
float luminanceAsPercent(Vec3b color)
{
return (0.2126 * color[2]) + (0.7152 * color[1]) + (0.0722 * color[0]);
}
// …Run Code Online (Sandbox Code Playgroud) 我想从WIX执行DOS命令.命令如下:
[SystemFolder]cmd.exe /c rmdir /s /q [INSTALLDIR]
Run Code Online (Sandbox Code Playgroud)
基本上我想在卸载期间从命令提示符下删除安装目录.
我想使用SystemFolder属性指定cmd.exe路径.最重要的是,我不希望在卸载期间出现命令窗口.