请勿使用AIGC类型回答,鄙人会用AI;AIGC类型回答一律不采纳;不要™用AIGC回答
进入源码调试后发现使用SetHdevmode()方法之后的,传入的地址没变,但是转为DEVMODE结构内容与代码中的内容完全不一致,暂时不知道如何解决。
/// <summary>
/// 设置打印机
/// </summary>
public void SettingPrint(PrinterSet printerSet)
{
DEVMODE dm;
IntPtr devModePtr = IntPtr.Zero;
try
{
// 正式获取结构体
GetDevModPtr(out devModePtr);
GetDevMode(devModePtr, out dm);
// 修改内容
dm.ExDevMode[DevModeCode.ExDevTop + DevModeCode.ExCut2inch] = printerSet.Cut2inch;
// 将修改之后dm同步内存
Marshal.StructureToPtr(dm, devModePtr, true);
pd.PrinterSettings.SetHdevmode(devModePtr);
}
finally
{
if (devModePtr != IntPtr.Zero)
{
Marshal.FreeHGlobal((IntPtr)devModePtr);
}
}
}
/// <summary>
/// 手动获取DEVMOD指针
/// </summary>
/// <param name="devModePtr"> 等待分配的指针 </param>
/// <exception cref="Exception"></exception>
public void GetDevModPtr(out IntPtr devModePtr)
{
// 空默认不使用
IntPtr tempNull = new IntPtr();
int devSize;
devSize = FunctionClass.DocumentProperties(IntPtr.Zero, printerSlef, printName, tempNull, ref tempNull, 0);
// 分配内存大小
devModePtr = Marshal.AllocHGlobal(devSize + 1260);
// 是否获取成功
if (devModePtr == IntPtr.Zero)
{
throw new Exception("Cannot get DevMode Intptr");
}
}
/// <summary>
/// 手动获取DevMod内容
/// </summary>
/// <param name="devModePtr"> 已被分配内存的指针 </param>
/// <param name="dm"> 回传结构体 </param>
/// <exception cref="Exception"></exception>
public void GetDevMode(IntPtr devModePtr, out DEVMODE dm)
{
IntPtr tempNull = IntPtr.Zero;
int resultCode;
// 再次访问获取实际数据
resultCode = FunctionClass.DocumentProperties(0, printerSlef, printName, devModePtr, ref tempNull, DevModeCode.DM_OUT_BUFFER);
if (resultCode < 0)
{
throw new Exception("Cannot get DevMode"); ;
}
dm = Marshal.PtrToStructure<DEVMODE>(devModePtr);
}