Tag: pinvoke

PInvoke和EntryPointNotFoundException

我无法理解下面的pinvoke有什么问题导致了EntryPointNotFoundException: 带有结构声明的C函数: extern “C”__declspec (dllimport) __stdcall LONG NET_DVR_Login_V30 (char *sDVRIP, WORD wDVRPort, char *sUserName, char *sPassword, LPNET_DVR_DEVICEINFO_V30 lpDeviceInfo); typedef struct { BYTE sSerialNumber[48]; BYTE byAlarmInPortNum; BYTE byAlarmOutPortNum; BYTE byDiskNum; BYTE byDVRType; BYTE byChanNum; BYTE byStartChan; BYTE byAudioChanNum; BYTE byIPChanNum; BYTE byZeroChanNum; BYTE byMainProto; BYTE bySubProto; BYTE bySupport; BYTE byRes1[20]; }NET_DVR_DEVICEINFO_V30, *LPNET_DVR_DEVICEINFO_V30; C#中的导入,结构声明和pinvoke: [DllImport(“SDK.dll”, SetLastError = […]

在C#中导入C dll,如何转换短**类型

我想在C#中导入一个用C语言编写的dll。 以下是我要调用的函数的格式。 /* *ReadAnswer *@param objectID The answer object ID *@param answerBuf The answer buffer.This buffer is automatically allocated by the function. It is automatically recycled with each call. A call to this function with an empty answer or a new request will automatically free the allocated buffer. *@param answerBufferSize The answer buffer size.This function […]

来自C ++的Pinvoke结构转换

以下是一些经过validation的C ++: typedef struct { PVOID buffer; UINT32 length; } DATA_BUFFER; typedef struct { DATA_BUFFER TxBuf [1]; DATA_BUFFER RxBuf [1]; } JVM_COMM_BUFFER; UINT32 SendAndRecv( IN JHI_HANDLE handle, IN CHAR* AppId, INOUT JVM_COMM_BUFFER* pComm ); 以下是我尝试将其移植到C#: [StructLayout(LayoutKind.Sequential)] public struct DATA_BUFFER { public byte[] buffer; public uint length; } [StructLayout(LayoutKind.Sequential)] public struct JVM_COMM_BUFFER { public DATA_BUFFER TxBuf; […]

编写一个轻量级的libVLC包装器。 需要帮助(Newish to P / Invoke)

我正在为LibVLC媒体库编写一个超级简单的超轻重量.Net包装器,因为我需要访问的唯一内容是播放,暂停和停止媒体文件的能力。 我已经发布了几个问题并得到了一些答案但不幸的是我只是留下了更多的问题。 我们将从顶部开始,然后继续努力。 文档首先声明我必须通过调用具有此规范的函数来初始化VLC: libvlc_instance_t* libvlc_new (int argc, const char *const *argv) 我为其定义了以下方法: [DllImport(“libvlc”, EntryPoint = “libvlc_new”, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr NewCore(int argc, IntPtr argv); 而我正在调用这样的函数: private IntPtr Instance; this.Instance = DGLibVLC.NewCore(0, IntPtr.Zero); 我尝试了几种不同的方法。 最初我不知道CallingConvention导致了一个不平衡的堆栈,它首先把我带到了这里。 这个问题已经解决,并且该方法经历了几次迭代,其中没有一次certificate是成功的,我的意思是在方法调用之后IntPtr始终为0。 我已经尝试过它,就像它在上面一样,第二个参数是String[] argc , [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] ,我试过让它返回Long(其中实际上导致Long有一个值,但到目前为止没有任何工作正常。 有谁知道从LibVLC DLL库调用此函数的正确方法? 编辑:在一个建议我试图调用库的错误消息function: 规格: const char* libvlc_errmsg […]

VkKeyScanEx / Sendinput替代unicode?

我正在尝试发送一个角色。 因此,我使用位于user32.dll中的本机方法GetKeyboardLayout和VkKeyScanExW来获取系统当前键盘布局的虚拟键代码(以及shift和control-state)。 然后,我使用user32.dll的本机方法SendInput将此虚拟键码发送到应用程序。 一切都很好 – 除了欧元符号。 当我将此字符作为参数传递给VkKeyScanExW时,它返回-1,这意味着找不到。 在我的键盘上使用Ctrl + Menu + E(德语布局)定位 现在我假设这是因为欧元符号是unicode符号而不是映射在ascii-layout中。 我读Sendinput也允许使用硬件扫描码的unicode模式。 所以我希望使用SendInput的unicode模式来解决我的问题。 但我想我的虚拟代码不是硬件扫描代码,因为unicode范围更宽。 我在哪里可以找到如何通过SendInput将unicode字符(例如€)发送到另一个控件/窗口的示例。 MSDN和pinvoke.net不提供有用的示例。

从代码中静音系统

我正试图从我的C#控制台应用程序中静音PC扬声器。 我已经尝试了本网站上建议的代码,但它不会影响我的机器上的音量。 我需要代码在Win7上工作,我认为代码只适用于XP。 我也试过这个: [DllImport(“winmm.dll”, SetLastError = true, CallingConvention = CallingConvention.Winapi)] public static extern int waveOutSetVolume(IntPtr uDeviceID, int dwVolume); waveOutSetVolume(IntPtr.Zero, 0); 但是当调用waveOutSetVolume方法时,系统不会静音,也不会抛出任何错误。 有没有办法在Win7中使用C#静音PC?

Getfield.SetValue不起作用

在我的项目中我正在努力我偶然发现了这个问题: 我想创建一个类“ApiID”的实例。 我从Reflector获得了代码,因为你可以看到.dll(不是我的Project)导入来自ummanaged代码,我无权访问。 [StructLayout(LayoutKind.Sequential, Size=0x10), CLSCompliant(false), NativeCppClass, DebugInfoInPDB, MiscellaneousBits(0x40)] public struct ApiId { private long ; public static unsafe void (ApiId* idPtr1, ApiId* idPtr2) { ApiId.{ctor}(idPtr1, (ApiId modopt(IsConst)* modopt(IsImplicitlyDereferenced)) idPtr2); } public static unsafe void (ApiId* idPtr1) { ApiId.{dtor}(idPtr1); } } 我的C#-Code看起来像这样: var _apiId = new ApiId(); long vlue = 0x0000000041403070; typeof(ApiId).GetField(“”, BindingFlags.Instance | BindingFlags.NonPublic).SetValue(_apiId, […]

更改文件的ACL以允许每个人的完全访问权限

如何将文件所有者更改为Everyone并允许Everyone对象Full Access ? 有没有可用的API? 我必须使用P / Invoke吗? 我到处搜索,但找不到任何可以做到这一点。

P / Invoke in ASP.NET(从dll读取/写入文本文件)

我有一个C++ Win32程序,我正在编写和阅读文本文件。 这个C ++程序生成一个DLL,我在ASP.NET Web应用程序中引用了这个dll。 使用P / Invoke,我正在调用从这个dll读取和写入文件的方法。 当我在WPF应用程序中使用P / invoke测试时,dll工作正常。 引用dll位于此WPF应用程序的bin/Debug文件夹中,调用时dll中的write方法在同一文件夹中生成文本文件。 此外, from the same folder ,我可以使用dll的read方法来读取文本文件。 但是,当我从我的ASP.NET Web应用程序调用Dll方法时,生成的文件会转到其他目录(很可能因为dll被加载到其他地方执行)并且我无法找到此生成文件的位置(没有任何错误) 与桌面应用程序类似,是否有某种方式将fie写入bin文件夹本身,以便我可以从bin文件夹本身读取? 示例代码: .cpp文件 extern “C” D_API int Write1() { ofstream myfile; myfile.open (“example.txt”); myfile <> output; } } return output; } C#.aspx.cs [DllImport(“Testing1.dll”, EntryPoint = “fnTest”, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] public static extern […]

如何将结构数组从c ++传递给c#?

我通过这种方式将结构从c ++传递给c#: 声明c ++结构: typedef struct _OrderUpdate { int32_t instrumentId; /* other fields */ } OrderUpdate; 声明c#struct: public struct OrderUpdate2 { public int instrumentId; /* other fields */ } 在c ++中声明回调: typedef void (__stdcall * OrderUpdateCallback)(OrderUpdate*); __declspec(dllexport) void InitializeCallback(long orderUpdateCallbackAddress) OrderUpdateCallback orderUpdateCallback = (OrderUpdateCallback) orderUpdateCallbackAddress; 并使用它: OrderUpdate curOrderUpdate; orderUpdateCallback(&curOrderUpdate); 在c#初始化回调和进程中: [DllImport(“NativeAdapter.dll”), SuppressUnmanagedCodeSecurity] public static extern […]