我的老板要我用C++编写一个DLL(MSVC++ 2010),它可以执行卷影复制,他可以从VB6(或以后的其他语言)调用它,并且可以在未完成时返回状态更新.他称之为"事件".
我觉得我最终需要学习COM(我宁愿不......)...而且,我想到了一个回调函数,但是从VB6到C++的函数指针肯定是不可能的?
有人可以概述我必须学习什么以及如何在有或没有COM的情况下实现这一目标?
编辑:回答问题,工作流程应该是:
VB6应用程序确定要备份的文件
我有一个路径并制作一个临时的卷影副本,其中包含此路径并返回一个挂载点(或类似的)
VB6应用程序备份卷影副本,然后删除卷影副本.
我找到了这个源代码:
inline GUID& WString2Guid(wstring src)
{
static GUID result;
HRESULT hr = ::CLSIDFromString(W2OLE(const_cast<WCHAR*>(src.c_str())), &result);
if (FAILED(hr)) {
//ERROR: The string '%s' is not formatted as a GUID!
throw(E_INVALIDARG);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
在这里返回引用有什么用?调用代码无论如何都无法获得引用,因为该变量将在那时离开其范围.那么这个小&标志有什么不同吗?
澄清/扩展问题:在同一个示例程序中,该函数被称为
GUID guid = WString2Guid(id); // way 1
Run Code Online (Sandbox Code Playgroud)
如果我想使用该参考,我不会打电话
GUID& guid = WString2Guid(id); // way 2
Run Code Online (Sandbox Code Playgroud)
代替?
另一个问题; 为什么之前CLSIDFromString使用::范围运算符调用函数?如果有另一个使用相同名称声明的本地函数,这只会有意义,不是吗?
我正在寻找一种方法来自动释放一个wchar_ts 数组- 有点像autopointer(我真的没有使用std :: auto_ptr,但我认为它不能用于数组).
我现在的代码是这样的:
/* volume is of type wstring,
* hr is of type HRESULT,
* VSS_PWSZ equals wchar_t*
*/
VSS_PWSZ pwszVolume = new wchar_t[volume.size() + 1];
std::copy(volume.begin(), volume.end(), &pwszVolume);
pwszVolume[volume.size()] = 0;
hr = pDiffMgmt->QueryDiffAreasOnVolume(pwszVolume, &pEnumMgmt);
delete[] pwszVolume;
pwszVolume = NULL;
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么这个愚蠢的功能不能采取const wchar_t*,否则我可以通过volume.c_str().
到目前为止这么好,我认为我的代码解决了这个问题,但现在内存管理变得越来越复杂了:我必须复制delete[]代码来解决可能抛出的异常(我不想在这一点上抓住它) .)
有没有办法pwszVolume在剩下当前范围时自动解除分配?
我被要求将一个本地提交中的一个文件中的几个不相关的更改拆分为两个单独的提交(例如,我修复了一个错误,但也进行了一些拼写检查,这不应该是此修复程序的一部分) 。基本上,我需要从现有提交中“樱桃挑选”一些更改到新提交中。git可以以任何方式帮助我吗?最好的方法是什么?
系统chrono头 ( /usr/include/c++/9/chrono) 声明但不定义static now()其时钟的功能。我也没有看到看起来相关的包含内容。这些功能是在哪里实现的呢?
我有一个 C++14 项目,无法使用 C++17 内联变量。
// myclass.h
class MyClass {
struct Inner {
using StringArray = std::array<const char*, 1>;
static constexpr StringArray kStrings{{ "foo" }};
}
}
//myclass.cpp
constexpr MyClass::Inner::StringArray kStrings;
// ^^^^^
// Error: "Inner" is a private member of "MyClass"
Run Code Online (Sandbox Code Playgroud)
是否可以让它在 C++14 中工作,或者只能在 C++17 中工作?
我是一名Java程序员,对VB不太了解.
我的任务:
创建一个exe.当我运行exe时,它将读取一个文本文件,然后它将显示内容.之后,应用程序代码结束.
我做了什么:
我创建了一个项目并在表单上创建了一个按钮.点击按钮,我已经选择了阅读.
问题
我无法找到必须用于在启动时运行代码的事件以及在我的任务完成时代码结束应用程序的代码.
请帮助我完成我必须遵循的流程.如果提供代码,那是最好的,但如果有人知道任何网络资源,它也将是一个很大的帮助.
我在一个最近经过重组的大型代码库中工作,许多文件不再是我所期望的。
如何查看在两次提交之间移动/重命名的文件列表?我对这些或其他文件的更改不感兴趣,只是以某种方式将旧名称映射到新名称的视图。
我正在尝试编写一个好的zipAll函数——不像 Scala 的函数,而是像 C++ 的函数zip_view:只是 Kotlin 的 zip,其中并行迭代任意数量的序列,长度等于最短。
我想出了:
fun <T> zipAll(vararg seq: Sequence<T>): Sequence<List<T>> {
return sequence {
while (seq.all { it.iterator().hasNext() })
yield(seq.map { it.take(1).first() })
}
}
fun main() {
val s = sequenceOf(1,2,3)
val s2 = sequenceOf(3,4,5,6)
println(zipAll(s, s2).toList())
}
Run Code Online (Sandbox Code Playgroud)
但Kotlin Playground 给出了(编辑:使用我本地 IntelliJ Idea 中更完整的堆栈跟踪)
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.Arrays.copyOf(Arrays.java:3512)
at java.base/java.util.Arrays.copyOf(Arrays.java:3481)
at java.base/java.util.ArrayList.grow(ArrayList.java:237)
at java.base/java.util.ArrayList.grow(ArrayList.java:244)
at java.base/java.util.ArrayList.add(ArrayList.java:454)
at java.base/java.util.ArrayList.add(ArrayList.java:467)
at kotlin.sequences.SequencesKt___SequencesKt.toList(_Sequences.kt:816)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
c++ ×5
git ×2
vb6 ×2
c++-chrono ×1
c++14 ×1
com ×1
constexpr ×1
dll ×1
file-rename ×1
gcc9 ×1
kotlin ×1
reference ×1
sequence ×1
static ×1
system-clock ×1