标签: pinvoke

如何在C#中调用"CreateFile"?

在获得有关从存储设备检索.MBR的大量信息之后,结论是使用P/Invoke来调用CreateFile.

但是如何在C#中完成这项工作?请说明!对你的帮助表示感谢!!!

c# pinvoke

9
推荐指数
1
解决办法
2万
查看次数

如何在C#中释放IntPtr?

如何释放ptrSentFromPinvokedDLL?

IntPtr ptrSentFromPinvokedDLL= IntPtr.Zero;

int resultFromVendor = CallVendorDll(ref ptrSentFromPinvokedDLL);

resultFromVendor = DoMoreWorkFromVendorDLL(
    ptrSentFromPinvokedDLL, "workonthis");

// Free ptrSentFromPinvokedDLLhere
Run Code Online (Sandbox Code Playgroud)

c# pinvoke interop

9
推荐指数
1
解决办法
9238
查看次数

如何在C#.Net中将空指针传递给Win32 API?

我正在查看RegisterHotKey函数:

http://msdn.microsoft.com/en-us/library/ms646309(VS.85).aspx

BOOL RegisterHotKey(
  __in  HWND hWnd,
  __in  int id,
  __in  UINT fsModifiers,
  __in  UINT vk
);
Run Code Online (Sandbox Code Playgroud)

我一直在使用IntPtr传递第一个参数,在大多数情况下都能正常工作.但是现在我需要故意传递一个空指针作为第一个参数,IntPtr(故意)不会这样做.我是.Net的新手,这让我感到困惑.我怎样才能做到这一点?

c# null pinvoke

9
推荐指数
1
解决办法
7445
查看次数

如何在不调用函数的情况下检查C#中是否存在DLL入口点

我正在使用OpenTK OpenGL包装器.由于它加载OpenGL DLL(或Linux上的.so),它包含许多DLL导入函数.

麻烦的是,一些驱动程序不会导出所有功能.有没有办法检查入口点是否存在?我需要这样做,因为实际调用具有它的系统上的函数如果没有以正确的顺序完成将导致崩溃.所以捕获EntryPointNotFound异常在我的情况下不起作用.

c# pinvoke

9
推荐指数
1
解决办法
2908
查看次数

为PInvoke正确声明SP_DEVICE_INTERFACE_DETAIL_DATA

SP_DEVICE_INTERFACE_DETAIL_DATA结构:

typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA {
  DWORD cbSize;
  TCHAR DevicePath[ANYSIZE_ARRAY];
} SP_DEVICE_INTERFACE_DETAIL_DATA, *PSP_DEVICE_INTERFACE_DETAIL_DATA;
Run Code Online (Sandbox Code Playgroud)

如何在C#中声明它才能Marshal.SizeOf正常工作?

我没有分配动态缓冲区的问题.我只想以cbSize适当的,非硬编码的方式进行计算.

PInvoke.net定义是错误的.
PInvoke.net的解释也是错误的:

SP_DEVICE_INTERFACE_DETAIL_DATA didd = new SP_DEVICE_INTERFACE_DETAIL_DATA();
didd.cbSize = 4 + Marshal.SystemDefaultCharSize; // trust me :)
Run Code Online (Sandbox Code Playgroud)

不要相信他.
4 + Marshal.SystemDefaultCharSize仅在x86上有效.同样的sizeof(int) + Marshal.SystemDefaultCharSize.在x64上它失败了.

这是非托管C++给出的:

x86
结构尺寸A:5
设备路径偏移A:4
结构尺寸W:6
设备路径偏移W:4

x64
结构尺寸A:8
设备路径偏移A:4
结构尺寸W:8
设备路径偏移W:4

我想每一个可能的组合StructLayoutMarshalAs参数,但我不能让它返回上述值.

什么是正确的声明?

c# pinvoke winapi memory-alignment

9
推荐指数
1
解决办法
2817
查看次数

如何在涉及指针时进行P/Invoke

为了学习在C#中使用PInvoke,我有点不确定如何使用涉及简单值类型的指针处理各种情况.

我从非托管DLL导入以下两个函数:

public int USB4_Initialize(short* device);
public int USB4_GetCount(short device, short encoder, unsigned long* value);
Run Code Online (Sandbox Code Playgroud)

第一个函数使用指针作为输入,第二个函数使用指针作为输出.它们在C++中的用法相当简单:

// Pointer as an input
short device = 0; // Always using device 0.
USB4_Initialize(&device);

// Pointer as an output
unsigned long count;
USB4_GetCount(0,0,&count); // count is output
Run Code Online (Sandbox Code Playgroud)

我在C#中的第一次尝试导致以下P/Invokes:

[DllImport("USB4.dll")]
public static extern int USB4_Initialize(IntPtr deviceCount); //short*

[DllImport("USB4.dll")]
public static extern int USB4_GetCount(short deviceNumber, short encoder, IntPtr value); //ulong*
Run Code Online (Sandbox Code Playgroud)

如何在C#中使用这些函数的方式与上面的C++代码相同?有没有更好的方法来声明这些类型,也许使用MarshalAs

c# pinvoke dllimport

8
推荐指数
1
解决办法
7530
查看次数

"使用"vs [DllImport]?

我想知道什么是最顶级声明的引用,为什么我们仍然需要使用DllImport?我在说C#.

c# pinvoke using dllimport

8
推荐指数
2
解决办法
6437
查看次数

为什么.NET程序能够在损坏的堆栈中存活?(当使用错误的调用约定时)

在VS2010中,如果使用错误的调用约定调用函数,则托管调试助手将为您提供pInvokeStackImbalance异常(pInvokeStackImbalance MDA),这通常是因为在调用C库时未指定CallingConvention = Cdecl.比如你写的

[DllImport("some_c_lib.dll")]
static extern void my_c_function(int arg1, int arg2);
Run Code Online (Sandbox Code Playgroud)

代替

[DllImport("some_c_lib.dll", CallingConvention=CallingConvention.Cdecl)]
static extern void my_c_function(int arg1, int arg2);
Run Code Online (Sandbox Code Playgroud)

因此获得了StdCall调用约定而不是Cdelc.

如果你回答这个问题,你已经知道了这个差异,但是对于这个线程的其他访问者:StdCall意味着被调用者清除堆栈中的参数,而Cdecl意味着调用者清理堆栈.

因此,如果您的C代码中的调用约定错误,则您的堆栈不会被清理并且程序崩溃.

但是,即使.NET程序使用StdCall进行Cdecl功能,.NET程序似乎也不会崩溃.默认情况下,VS2008上没有启用堆栈不平衡检查,因此一些VS2008项目使用了他们的作者不知道的错误调用约定.我刚尝试过GnuMpDotNet,即使缺少Cdelc声明,样本运行也很好.X-MPIR也是如此.

它们都在调试模式下抛出pInvokeStackImbalance MDA异常,但在发布模式下不会崩溃.为什么是这样?.NET VM是否将所有对本机代码的调用包装起来并在之后恢复堆栈本身?如果是这样,为什么还要使用CallingConvention属性呢?

.net pinvoke dllimport

8
推荐指数
1
解决办法
1133
查看次数

使用C#代码中的C库

我有一个C语言的库.是否可以在C sharp中使用它.

http://zbar.sourceforge.net/ 是我想要使用的库的链接

c c# pinvoke

8
推荐指数
1
解决办法
2万
查看次数

在多线程环境中从C#调用Delphi DLL时发生访问冲突

我正在使用P/Invoke从C#调用用Delphi XE2编写的DLL函数.当从单个线程顺序进行调用时,它似乎正在工作.但是,当多个线程调用该函数时,C#主机应用程序System.AccessViolationException似乎随机抛出.

为什么下面的代码会触发访问冲突,我该如何解决?

用于重现问题的最小Delphi库代码:

library pinvokeproblem;

{$R *.res}

uses Windows, SysUtils;

procedure Test(const testByte: byte); stdcall;
begin
  OutputDebugString(PWideChar(IntToStr(testByte)));
end;

exports Test;

end.
Run Code Online (Sandbox Code Playgroud)

用于重现问题的最小C#主机应用程序代码:

[DllImport(
    "pinvokeproblem.dll",
    CallingConvention = CallingConvention.StdCall,
    EntryPoint = "Test")]
private static extern void Test(byte testByte);

public static void Main(string[] args)
{
    for (int i = 1; i <= 1000; i++) // more iterations = better chance to fail
    {
        int threadCount = 10;
        Parallel.For(1, threadCount, new ParallelOptions { MaxDegreeOfParallelism = threadCount }, test =>
        {
            byte …
Run Code Online (Sandbox Code Playgroud)

.net c# delphi pinvoke multithreading

8
推荐指数
1
解决办法
862
查看次数

标签 统计

pinvoke ×10

c# ×9

dllimport ×3

.net ×2

c ×1

delphi ×1

interop ×1

memory-alignment ×1

multithreading ×1

null ×1

using ×1

winapi ×1