2015-06-29 45 views
-2

展望从vssapi.dll DLL导入,C#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' 的切入点。冒号的变化(删除等),并颠倒名称(作为装饰版)也没有给我带来任何喜悦。

我知道它可以使用装饰的名称或序号工作,但我希望代码具有合理的可移植性(取消依赖于编译器,并且我见过的没有任何东西表示序号在更新中保持不变)。

是啊我已经知道这个DLL它不会移植到Vista之前...我可以住。
也听说AlphaVSS - 但是我需要什么会像使用航母去湖边钓鱼( - 并且做他们真正需要做起来很笨拙的使用?)

+0

我投票结束这个问题,因为它是废话,因为它是废话 – Rob

回答

1

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

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

无论哪种方式,p/invoke都无法帮到你。

+0

但他们**可以被p /调用使用序号或装饰名称... 我担心,虽然这样做是不太便携因为如果新版本发布,cdecl/ord可能会更改。想知道如何(如果可能)指定EntryPoint不使用ord/cdecl。 – Rob

+0

您可以调用'GetProcAddress'并获取函数指针并不意味着您可以成功调用这些方法。你将需要重新校准你的期望。你知道什么是实例方法吗?如果是这样,那么你会知道传递给方法的隐式'this'指针。问问你自己1.从哪里可以得到你的C#代码中的指针,因为你不能调用C++构造函数,以及2.如果函数没有通过它,函数如何接收这个'this'指针。 –

+0

好吧,我错了,你是正确的(upvoted你的回答)...我现在得到它,当你提到缺乏'这个'实例(作为一个简单的函数,我想只是一个侥幸它[排序?]的工作,......但孤立地说,这无关紧要。) – Rob