【发布时间】:2017-02-06 22:28:15
【问题描述】:
我想用c++函数代码转成.net代码
MYDLL_API BOOL GetFolderSize(LPCTSTR lpszStartFolder,
BOOL bRecurse,
BOOL bQuickSize,
PLARGE_INTEGER lpFolderSize,
LPDWORD lpFolderCount /*= NULL*/,
LPDWORD lpFileCount /*= NULL*/);
所以我创建了 dll 来导出代码 然后在 C# 代码中使用 PInvoke
[StructLayout(LayoutKind.Explicit, Size = 8)]
struct LARGE_INTEGER
{
[FieldOffset(0)]
public Int64 QuadPart;
[FieldOffset(0)]
public UInt32 LowPart;
[FieldOffset(4)]
public Int32 HighPart;
}
[DllImport("mydll.dll")]
extern static bool GetFolderSize(string lpszStartFolder,
bool bRecurse,
bool bQuickSize,
out LARGE_INTEGER lpFolderSize,
out UInt32 lpFolderCount,
out UInt32 lpFileCount);
这有什么问题????
但是当我调用它时,它会给我运行时异常 调用 PInvoke 函数 'dublication!dublication.Form1::GetFolderSize' 使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配
【问题讨论】:
-
PLARGE_INTEGER 和 LPDWORD 应该是
IntPtr,不是吗? -
我尝试并重试此方法,但它不起作用,并且引发了相同的异常
-
@EdPlunkett “out”将添加指针。
-
@RobertFraser 好点,我不知道我今天的大脑在哪里
-
注意
bool,C++ 在 windows.h 和 the two are not the same size 中有一个 'bool' 内置类型和一个BOOLtypedef。见blogs.msdn.microsoft.com/jaredpar/2008/10/14/…