我想创建一个C#程序来配置Windows Mobile设备.我在一个名为DMProcessConfigXML的函数上找到了MSDN文档,但没有关于如何使用此函数的说明.
如何在Windows Mobile应用程序中使用此功能?我怀疑它与使用pinvoke有关.
谢谢,
保罗
我想在我的.NET应用程序中使用Win32 API中的函数,但我不知道DLL文件中声明的方法的签名.如果我使用DllImport,我必须提供该方法的定义,以便将其用作"外部方法".
或者还有另一种方法吗?
我希望有一个在后台运行的程序,监听任何文件传输,然后取消资源管理器的文件传输机制,并启动它自己的.
我该怎么做呢?有什么dll我可以pinvoke?
为什么?
*通过文件传输我的意思是通过拖放移动/复制文件/文件夹,但我只关心从磁盘到磁盘的文件传输,而不是从互联网.
所以,我想在 C# 中使用 CreateProcess API 函数。我知道我必须导入 kernel32.dll 文件并覆盖函数头并将其标记为 extern。我也知道我必须实现函数使用的结构。我遇到的问题如下:在哪里可以看到我需要实现的结构的确切结构?
[DllImport("Kernel32.dll")]
public static extern HANDLE CreateThread(PSECURITY_ATTRIBUTES psa,
DWORD cbStack,
PTHREAD_START_ROUTINE pfnStartAddr,
PVOID pvParam,
DWORD fwdCreate,
PDWORD pdwThreadID);
Run Code Online (Sandbox Code Playgroud)
我需要实现以下结构才能使其正常工作:HANDLE、DWORD...其余的我该怎么做?
我正在尝试为一组非托管 C++ 库创建包装器。我有库的代码,因此我下载了 P/invoke 互操作助手。
我对 C++ 项目中的导出内容有点困惑。它只是项目的标题吗?
这是一个相当大的工程。我是否只需将每个库的标头加载到命令行工具中并生成 C# 签名?
完成此操作后,我是否需要手动将实际的 dll 导入添加到它们中,如下所示,或者是否有一种方法将其定义为一个 DLL?:
[DllImport(MyDLL.dll)]
Run Code Online (Sandbox Code Playgroud) 我调用了Kernel32的复制文件方法:
[DllImport("kernel32.dll",
CharSet = CharSet.Unicode,
CallingConvention = CallingConvention.StdCall,
SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CopyFile(
[MarshalAs(UnmanagedType.LPStr)] string lpExistingFileName,
[MarshalAs(UnmanagedType.LPStr)] string lpNewFileName,
[MarshalAs(UnmanagedType.Bool)] bool bFailIfExists);
[DllImport("kernel32.dll")]
public static extern uint GetLastError();
Run Code Online (Sandbox Code Playgroud)
但是,当我调用它时,它从GetLastError()返回2,这意味着找不到文件.路径肯定存在.
string newfile = Environment.CurrentDirectory + "\\temp" + Path.GetExtension(file);
uint i;
if (!CopyFile(file, newfile, true)) i = GetLastError();
Run Code Online (Sandbox Code Playgroud)
我试图通过这个解决方案绕过LongPath异常.但即使使用普通文件,它似乎也不起作用.任何帮助,将不胜感激.
这是Form1的完整代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Shell32;
using System.Xml;
using System.Diagnostics;
using word = Microsoft.Office.Interop.Word; …Run Code Online (Sandbox Code Playgroud) 我需要从C#console app调用一个用c ++编写的dll函数.我编写了编组并在C#中编写了相同的数据类型.但无论如何我得到错误.问题出在哪儿?
这是dll函数的代码
extern "C" {
SAMPLENATIVEDLL_API int GetCardInfoEx(INT64 Card, DWORD Restaurant, DWORD UnitNo, TCardInfoEx* Info, char* InpBuf, DWORD InpLen, WORD InpKind, char* OutBuf, DWORD OutLen, WORD OutKind) {
int res = getCardInfoEx(Card, Info, UnitNo);
return res;
}
Run Code Online (Sandbox Code Playgroud)
}
这是TCardInfoEx结构代码
#pragma pack(1)
typedef struct TCardInfoEx {
WORD Size;
BYTE Deleted;
BYTE Seize;
BYTE StopDate;
BYTE Holy;
BYTE Manager;
BYTE Blocked;
CHAR WhyLock[256];
CHAR Holder[40];
INT64 UserID;
DWORD CardAccountNumber;
DWORD TypeOfDefaulter;
WORD Bonus;
WORD Discount;
INT64 Summa;
INT64 AvailableSumma;
INT64 …Run Code Online (Sandbox Code Playgroud) 使用SHGetFileInfo()函数,我可以获取的图标的最大大小是多少?就功能状态而言,我可以获得一个32x32像素图标(AKA SHGFI_LARGEICON).但是我试图弄清楚是否有办法获得更大的像48x48像素的图标.
我发现有常数像......
public const uint SHGFI_LARGEICON = 0x000000000; // get large icon
public const uint SHGFI_SMALLICON = 0x000000001; // get small icon
public const uint SHIL_JUMBO = 0x000000004; // get jumbo icon 256x256
public const uint SHIL_EXTRALARGE = 0x000000002; // get extra large icon 48x48
public const uint SHIL_LARGE = 0x000000000; // get large icon 32x32
public const uint SHIL_SMALL = 0x000000001; // get small icon 16x16
public const uint SHIL_SYSSMALL = 0x000000003; // get icon based off of …Run Code Online (Sandbox Code Playgroud) 所以最近我一直在阅读反调试机制和我遇到的流行方法,以检查当前进程是否正在调试OutputDebugString.我已经编写了这段代码,但它没有完全按照预期工作,有人可以解释为什么或我做错了什么?
private static bool stub_OutputDebugString()
{
uint ErrCode = 0x12A6;
Native.SetLastError(ErrCode);
Native.OutputDebugString("System.Core\n");
if (Marshal.GetLastWin32Error() == (int)ErrCode)
{
//Debugger Detected
return true;
}
else
{
//No Debugger Detected
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我的P/Invoke签名
[DllImport("kernel32.dll", SetLastError = true)]
public static extern void SetLastError(uint dwErrCode);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern void OutputDebugString(string lpOutputString);
Run Code Online (Sandbox Code Playgroud)
注意我读了如何GetLastError不应该从本机环境调用,因为值可以更改,所以我正在使用Marshal.GetLastWin32Error()
代码应该工作,但当我尝试使用windbg或任何其他调试器调试应用程序时,最后一个错误不会改变.
你如何固定Marshal.AllocHGlobal()分配的内存?
我的第一次尝试如下:
int bytes = 10;
IntPtr ip = Marshal.AllocHGlobal(bytes);
GCHandle iph = GCHandle.Alloc(ip, GCHandleType.Pinned);
Run Code Online (Sandbox Code Playgroud)
虽然我认为这只是引脚IntPtr而不是引用的内存块IntPtr.