Tag: dllimport

来自C#的DLL导入char *指针

我有一个用C ++创建的函数,并在DLL中提取。 我需要在我的应用程序中使用此函数函数如下:int SendText(void * pControl,char * sText); 我如何在我的C#代码中使用它。

从Metro Style App c#加载C库(gsdll32.dll)

我想使用Metro Style App c#中的gsdll32.dll。 我加载DLL如下: [DllImport(“gsdll32.dll”, EntryPoint = “gsapi_delete_instance”)] private static extern void gsapi_delete_instance(IntPtr instance); [DllImport(“gsdll32.dll”, EntryPoint = “gsapi_revision”)] private static extern int gsapi_revision(ref GS_Revision pGSRevisionInfo, int intLen); [DllImport(“gsdll32.dll”, EntryPoint = “gsapi_set_stdio”)] private static extern int gsapi_set_stdio(IntPtr lngGSInstance, StdioCallBack gsdll_stdin, StdioCallBack gsdll_stdout, StdioCallBack gsdll_stderr); 但是当我尝试加载dll时没有发现exception发生。 我已经把它放在Debug文件中了。 但它确实有效。 我从这个链接中引用。

你会如何声明DLL导入签名?

这是使用.NET的pHash的后续post 您如何在.NET中声明以下C ++声明? int ph_dct_imagehash(const char* file,ulong64 &hash); 到目前为止我有 [DllImport(@”pHash.dll”)] public static extern int ph_dct_imagehash(string file, ref ulong hash); 但我现在正在跟踪错误 ulong hash1 = 0, hash2 = 0; string firstImage = @”C:\Users\dance2die\Pictures\2011-01-23\177.JPG”; string secondImage = @”C:\Users\dance2die\Pictures\2011-01-23\176.JPG”; ph_dct_imagehash(firstImage, ref hash1); ph_dct_imagehash(secondImage, ref hash2); 它基本上说我的ph_dtc_imagehash声明是错误的。 我在这做错了什么?

在if语句中使用GetForegroundWindow结果来检查用户的当前窗口

我需要检查用户当前选择的窗口,如果选择了特定程序,则执行操作。 我以前没有使用过GetForegroundWindow函数,也找不到有关如何以这种方式使用它的任何信息。 我只需要比较当前窗口,看看它是否是一个特定的程序。 但是,GetForegroundWindow函数似乎不会返回字符串或int。 所以主要是我不知道如何找出我要比较的程序窗口的值。 我目前有代码来获取当前窗口: [DllImport(“user32.dll”)] private static extern IntPtr GetForegroundWindow(); IntPtr selectedWindow = GetForegroundWindow(); 我需要能够如下理想地应用它: If (selectedWindow!=”SpecificProgram”) { } 我希望GetForegroundWindow值/对象对每个程序都是唯一的,并且不会以某种方式运行,每个特定的程序/窗口每次都有不同的值。 我也将此作为Windows窗体的一部分,但我怀疑它很重要。 -谢谢你的帮助 编辑:这种方式有效,并使用当前窗口的图块,这使得它非常适合检查窗口是否正确: [DllImport(“user32.dll”)] static extern IntPtr GetForegroundWindow(); [DllImport(“user32.dll”)] static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); private string GetActiveWindowTitle() { const int nChars = 256; StringBuilder Buff = new StringBuilder(nChars); IntPtr […]

关于高分辨率性能计数器及其与.NET秒表相关的存在的说明?

在静态Stopwatch构造函数中,我们可以看到以下代码,它基本上检查是否存在高分辨率性能计数器。 static Stopwatch() { if (!SafeNativeMethods.QueryPerformanceFrequency(out Frequency)) { IsHighResolution = false; Frequency = 0x989680L; tickFrequency = 1.0; } else { IsHighResolution = true; tickFrequency = 10000000.0; tickFrequency /= (double) Frequency; } } 在MSDN上它说的是QueryPerformanceFrequency : 检索高分辨率性能计数器的频率(如果存在) 然而,目前还不清楚它究竟存在的时候? 我怀疑它通常存在于当前的机器上,但究竟不是吗? 这很有趣,因为当它不存在时, Stopwatch变成了DateTime.UtcNow属性的一个包装器。

如何使用C#中的struct pointer参数调用C ++函数?

还有一个function,它还没有工作。 我基本上是通过使用P / Invoke从C#调用一些C ++函数。 有问题的function确实向显示激光设备查询一些设备相关信息,例如最小和最大扫描速率以及每秒最大点数。 有问题的function是: int GetDeviceInfo(DWORD deviceIndex, DeviceInfo* pDeviceInfo); 这是我给出的C ++头文件。 这是非常简短的C ++ SDK描述的链接 。 我没有重建DLL文件的源代码,我也没有* .pdb文件(制造商无法提供): #pragma once #ifdef STCL_DEVICES_DLL #define STCL_DEVICES_EXPORT extern “C” _declspec(dllexport) #else #define STCL_DEVICES_EXPORT extern “C” _declspec(dllimport) #endif enum SD_ERR { SD_ERR_OK = 0, SD_ERR_FAIL, SD_ERR_DLL_NOT_OPEN, SD_ERR_INVALID_DEVICE, //device with such index doesn’t exist SD_ERR_FRAME_NOT_SENT, }; #pragma pack […]

来自C#的C ++:C ++函数(在DLL中)返回false,但C#认为它是真的!

我正在编写一个C#app,它在C ++ API中调用了一些函数。 我将C ++代码构建到DLL中,C#代码使用DllImport调用API。 (我使用.DEF文件作为C ++ DLL,因此我不需要extern“C”。) 到目前为止,API有一个function,目前绝对没有任何function: bool Foo() { return false; } 在C#中,我有以下内容: public class FooAPI { [DllImport(“Foo.dll”)] public static extern bool Foo(); } … bool b = FooAPI.Foo(); if (!b) { // Throw an exception } 我的问题是,由于某种原因,b总是评估为TRUE 。 我在if(!b)上有一个断点,调试器将其报告为’true’,与C ++函数返回的内容无关。 C#bool和C ++ bool一样吗? 虽然事实并非如此,但我仍然不知道如何将返回值设为’true’:) 任何人都可以帮我解决这个奇怪的差异吗? 提前致谢!

在我的.NET代码通过dllimport调用非托管dll中的函数之后,有没有办法调试正在发生的事情?

在我的.NET代码通过dllimport调用非托管dll中的函数之后,有没有办法调试正在发生的事情? 我在unmanaged via dllimport中暴露了一个dll函数。 当我通过代码调用函数时,会发生一些事情并且它永远不会返回。 有什么我可以做的,可能有调试视图或任何东西来获取任何信息? 或者我是SOL?

C#格式化外部Dll函数参数

我还没有找到关于这个主题的好参考。 对于这个例子,我们将采用一些我试图移植到C#的C ++代码。 在C ++领域,我们有一个外部库函数的原型: extern “C” DWORD EXPORT FILES_GetMemoryMapping( PSTR pPathFile, PWORD Size, PSTR MapName, PWORD PacketSize, PMAPPING pMapping, PBYTE PagesPerSector); 并在其中使用如下: FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)MapName, &PacketSize, pMapping, &PagePerSector); 现在我正在尝试将第一行移植到C#,这里是我没有明确路径的地方。 这是我到目前为止所得到的: [DllImport(“Files.DLL”)] public static extern uint FILES_GetMemoryMapping( [MarshalAs(UnmanagedType.LPStr)] string pPathFile, out ushort Size, [MarshalAs(UnmanagedType.LPStr)] string MapName, out ushort PacketSize, IntPtr pMapping, out byte PagesPerSector); 现在的问题是:有没有好的指南告诉我“PSTR […]

DLLImport Int ** – 如果可以的话,如何做到这一点

我试图使用第三方DLL,它想要一个int **作为方法的参数之一。 它将参数描述为指向内存分配的指针的地址。 对不起任何困惑。 我认为参数是双向的。 DLL用于与FPGA板通信,该方法是在主机PC和PCI板之间建立DMA传输。