-2

寻找从 dll 导入vssapi.dll

查看GetSnapshotDeviceName函数,DLL 导出查看器给了我:

protected: long __cdecl CVssWriter::GetSnapshotDeviceName(unsigned short const * __ptr64,unsigned short const * __ptr64 * __ptr64)const __ptr64
protected: long __cdecl CVssJetWriter::GetSnapshotDeviceName(unsigned short const * __ptr64,unsigned short const * __ptr64 * __ptr64)const __ptr64

假设我想要第一个,我如何声明 dll 导入,例如:

[DllImport("vssapi.dll", EntryPoint = "CVssWriter::GetSnapshotDeviceName", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
private static extern uint GetSnapshotDeviceName(string wszOriginalVolume, out string ppwszSnapshotDevice);

[有或没有 ExactSpelling] 总是给我

无法在 DLL“vssapi.dll”中找到名为“CVssWriter::GetSnapshotDeviceName”的入口点

错误。冒号的变化(删除等)和颠倒名称(作为装饰的版本)也没有给我带来快乐。

我知道它可以使用修饰名称或序数来工作,但我希望代码具有合理的可移植性(decls 依赖于编译器,而且我从未见过任何东西说序数在更新中也将保持不变)。

是的,我已经知道有了这个 dll,它不会移植到 Vista 之前的版本……我可以忍受。
也听说AlphaVSS过 - 但我需要的是使用航空母舰在湖上钓鱼(他们真的需要让它如此笨拙地使用吗?)

4

1 回答 1

1

这些是 C++ 实例方法,即成员函数。因此,它们不能使用 p/invoke 导入。您尝试使用的 VSS API 可作为 C++ 类或通过 COM 使用。

如果您需要的功能可通过 COM 接口获得,那么这将是您进行操作的最简单方法。否则,您将需要以一种或另一种方式包装 C++ 类。当然,最简单的方法是使用混合模式 C++/CLI 程序集。

无论哪种方式,p/invoke 都无法在这里为您提供帮助。

于 2015-06-29T06:44:35.050 回答