我想从在 Win 7 x64 上运行的 c# .Net 应用程序断开蓝牙设备。
我知道 MS 在 .Net 上提供的有关 BT 的功能非常少。
我搜索了 32feet.Net,并找到了如何连接、发现、获取信息……但没有找到有关断开连接的信息(我是否错过了什么?)。
然后,我在 Msdn IOCTL_BTH_DISCONNECT_DEVICE上找到了。问题是我不明白如何调用它。看来我应该将DeviceIOControl与 Platform Invoke 一起使用,但恐怕我没有足够的 .Net 技能来自己构建这个。
这是我现在所处的位置:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
using System.IO;
namespace BtDisco
{
class Program
{
const int IOCTL_BTH_DISCONNECT_DEVICE = 0x41000c;
[DllImport("Kernel32.dll", SetLastError = false, CharSet = CharSet.Auto)]
public static extern bool DeviceIoControl(
Microsoft.Win32.SafeHandles.SafeFileHandle hDevice,
uint dwIoControlCode,
[MarshalAs(UnmanagedType.AsAny)] [In] object InBuffer,
uint nInBufferSize,
[MarshalAs(UnmanagedType.AsAny)] [Out] object OutBuffer, …Run Code Online (Sandbox Code Playgroud) 我是 PInvoke 新手,需要一些帮助。
我想使用 PInvoke 访问 IEnumGUID,并且我在pinvoke.net上找到了一个代码块。
[ComImport, Guid("0002E000-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), ComVisible(false)]
public interface IEnumGUID
{
int Next(int celt, [Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)]Guid[] rgelt);
void Skip(int celt);
void Reset();
[return: MarshalAs(UnmanagedType.Interface)]
IEnumGUID Clone();
}
Run Code Online (Sandbox Code Playgroud)
这里的Clone函数将IEnumGUID作为返回值,而原始C++接口中的函数将其作为输出参数。
HRESULT Clone(
[out] IEnumGUID **ppenum
);
Run Code Online (Sandbox Code Playgroud)
我了解到PInvoke自动将HRESULT转换为COMException,但我不知道PInvoke如何将out参数转换为返回值。
请对此进行一些解释,以便我以后能够正确使用该方法。
我正在尝试从 WM_MOVE win32 消息读取 lParam x 和 y 坐标并获得奇怪的值。我需要以某种方式从 lParam IntPtr 中提取它们。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms632631(v=vs.85).aspx
谢谢
在使用 pinvoke 并在 Linux 上运行的 dotnet 核心应用程序中,当 c++ 抛出异常时 - 例如 -std::runtime_error我们得到:
terminate called recursively
terminate called after throwing an instance of 'terminate called after throwing an instance of 'std::runtime_error*'
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
即使外部 C++ 方法的调用包装在托管代码中的 try catch 块中。
如何在 dotnet core 托管代码中捕获和处理这个问题?
我使用 P/Invoke 将数据从 C# 代码传递到 C++ 代码,反之亦然。到目前为止效果很好。
最近我读了几篇文章(例如这篇需要固定这些数据的
我查阅了一些微软的文章,但对我来说,它们并不完全清楚何时需要手动完成固定。我对这篇文章的理解是,CLR 确保 GC 收集时不会出现问题。它通过固定数据或将数据复制到 GC 不收集的非托管内存中来实现这一点。所以对我来说这意味着程序员不需要关心固定。本文中的示例也没有显示任何固定。我仍然不确定我的结论是否正确。
进一步挖掘,我发现了我在代码中使用的特定数据类型的更多信息:
int, long:按值传递 - 因此不得固定。但是关于ref int?
IntPtr:我使用 AllocHGlobal() 在非托管内存中分配空间。GC 不涉及这一点。因此无需固定。
byte[]:通过引用传递但自动固定。请参阅此处:作为一种优化,可直接传送类型的数组和仅包含可直接传送成员的类的数组将在封送过程中固定而不是复制。
string:通过引用传递但自动固定。请参阅此处:在对 String 等对象进行封送期间会自动执行固定,但您也可以使用 GCHandle 类手动固定内存。
string[], 'custom struct with strings': 这里我真的不确定。“在对诸如 String [...] 之类的对象进行编组期间自动执行 Pinning ”这句话是否包含字符串数组和自定义结构?
目前我没有固定任何东西,代码工作正常。即使我在 C++ 执行其任务时强制 GC 进行收集。但这当然并不意味着它总是工作得很好。我使用.Net Framework 4.8。
我需要固定上述数据类型吗?
这里是:
static uint8_t* Compress(const uint8_t* input, uint32_t inputSize, uint32_t* outputSize, int compressionLevel);
我试过了 :
[DllImport("Mini7z.dll")]
public static extern byte[] Compress(byte[] input, uint inputSize, out uint outputSize, int compressionLevel);
Run Code Online (Sandbox Code Playgroud)
和这个
[DllImport("Mini7z.dll")]
public static extern byte[] Compress(byte[] input, uint inputSize, uint* outputSize, int compressionLevel);
Run Code Online (Sandbox Code Playgroud)
但似乎没有任何作用
我有一个C++ API原型
void Func(int& size);
Run Code Online (Sandbox Code Playgroud)
如何在C#中将其翻译为P/Invoke?
据我所知,如果我使用
public static extern Func(ref int size);
Run Code Online (Sandbox Code Playgroud)
,该函数将接收指向int而不是值的指针.
我即将开始研究针对内部客户的ClickOnce应用程序,以便在组织的Intranet上使用.我想简化设置过程,所以我认为开发部分信任的应用程序是个好主意,但现在我不太确定.
用户特别要求的一件事是(归结为)a TextBox与Cue Text.目前提供此功能的最简单方法是使用一个简单的子类,TextBox其中包含CueText功能作为属性.cuetext功能是通过PInvoke'd调用完成的SendMessage().
protected override void OnHandleCreated(EventArgs e)
{
this.UpdateCueText(); // Bang, you're dead here
base.OnHandleCreated(e);
}
private void UpdateCueText()
{
if (this.IsHandleCreated)
{
NativeMethods.SendMessage(new HandleRef(this, this.Handle), setCueBannerMessage, this.showCueTextWithFocus ? new IntPtr(1) : IntPtr.Zero, this.cueText);
}
}
Run Code Online (Sandbox Code Playgroud)
"啊哈!我需要SecurityPermission.UnmanagedCode." 默认的Intranet区域安全性包括SecurityPermission我可以告诉的权限,所以我尝试运行它,它会在调用时爆炸UpdateCueText().我甚至可以检查SecurityExceptionb/c 上的属性,每次尝试评估一个SecurityException属性都会引发另一个无法察觉的属性SecurityException.
我尝试标准修改:
protected override void OnHandleCreated(EventArgs e)
{
var permission = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode);
permission.Assert();
try
{
this.UpdateCue();
}
finally
{
CodeAccessPermission.RevertAssert();
}
base.OnHandleCreated(e); …Run Code Online (Sandbox Code Playgroud) 用户可以通过Alt + Tab或在TaskBar中单击其图标来切换活动应用程序.是否有可能获得当前活动应用程序的名称(或其他独特特征)?
我想编写一个程序来收集应用程序使用情况的统计信息.
我试图在windows ce 6.0环境中调用.net cf 3.5中的非托管c ++ dll中的函数.
结构定义为:
typedef struct TagOperatorInfo
{
DWORD dwMode;
DWORD dwFormat; //Operator name format
DWORD dwAct; //Network type(Available in 3G module£ºGSM or 3G),
TCHAR szOper[32];
}OperatorInfo,*LPOperatorInfo;
Run Code Online (Sandbox Code Playgroud)
和函数调用是:
BOOL GetCurOperatorInfo(LPOperatorInfo pinfo);
Run Code Online (Sandbox Code Playgroud)
我在.net中定义了TagOperatorInfo,如下所示:
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public struct TagOperatorInfo
{
/// DWORD->unsigned int
public uint dwMode;
/// DWORD->unsigned int
public uint dwFormat;
/// DWORD->unsigned int
public uint dwAct;
/// TCHAR[32]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 32)]
public string szOper;
}
Run Code Online (Sandbox Code Playgroud)
在看到一些文章和msdn文档后,我将本机函数称为:
[System.Runtime.InteropServices.DllImportAttribute(gsmaAdapterDLLName, EntryPoint = "#30", CallingConvention = CallingConvention.Winapi)] …Run Code Online (Sandbox Code Playgroud)