Importation C++ dll in C# AccessViolationException
Importation C++ dll in C# AccessViolationException
我在我的程序C#
中使用一个DLL写入C我有一些问题,当我执行它时,我的行有AccessViolationException
xijet_getPrinterParameter(id_printer,xijet_resolution,parametre);
using System;
using System.Collections;
using System.Collections.Generic;
using System.Management; // need to add System.Management to your project references.
using System.Runtime.InteropServices;
using System.Text;
using System.Drawing;
using System.IO;
namespace ConsoleApplication1
{
public class Program
{
ushort XIJET_RESOLUTION;//300*300 fast
ushort XIJET_TRIGGER_OFFSET;//2 inches
ushort XIJET_AUX_OUTPUT;
ushort XIJET_QUEUE_DEPTH=4;//4
ushort XIJET_SUB_SAMPLE;
ushort XIJET_JET_MASKING;
ushort XIJET_HEAD_HEIGHT;//0.5
uint XIJET_TRIGGER_MASK;
public struct XIJET_CARTRIDGE_PROFILE_STRUCT
{
public ushort voltage; // cartridge voltage, see unit table below
public ushort preFirePulseWidth; // Lexmark only, nSec units
public ushort gapWidth; // Lexmark only, nSec units
public ushort pulseWidth; // main fire pulse, see unit table below
public ushort temperature; // degrees C
};
public struct XIJET_CONFIGURATION
{
public ushort VerticalResolutionDPI; // printhead resolution
public ushort HorizontalResolutionDPI; // transport resolution
public ushort NumberOfPrintheads; // up to 4 printheads may be attached
public ushort Head1Height; // height of each printhead in pixels
public ushort Head2Height;
public ushort Head3Height;
public ushort Head4Height;
};
#region Importation
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern bool XIJET_ProbePrinter(ushort index,
StringBuilder PrinterName);
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern IntPtr XIJET_OpenPrinter(StringBuilder PrinterName,
ArrayList pPrinterConfig);
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern void XIJET_ClosePrinter(IntPtr PrinterHandle);
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern bool XIJET_GetPrinterResolution(List<char> PrinterName,
ushort ResolutionIndex,
List<char> ResolutionDescription,
List<ushort> HorizontalDPI,
List<ushort> VerticalDPI,
List<ushort> MaxSpeedIPS);
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_GetPrinterParameter(IntPtr PrinterHandle,
uint ParameterIndex,
IntPtr pParameter);
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_SetPrinterParameter(IntPtr PrinterHandle,
uint ParameterIndex,
IntPtr pParameter);
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_PrintDocumentPage( IntPtr PrinterHandle,
uint HorizontalWidth, // in pixels
uint VerticalHeight, // in pixels
byte[] pBitmappedBuffer, // 1-bit per pixel image
uint Head1Offset, // Vertical offset in pixels
uint Head2Offset, // Vertical offset in pixels
uint Head3Offset, // Vertical offset in pixels
uint Head4Offset, // Vertical offset in pixels
uint Timeout ); // timeout in msecs
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_CanvasBegin( IntPtr PrinterHandle, // as returned from open call
uint VerticalHeight, // in pixels
uint HorizontalWidth); // in pixels
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_CanvasWrite( IntPtr PrinterHandle, // as returned from open call
uint VerticalOffset, // in pixels
uint HorizontalOffset,// in pixels
uint VerticalHeight, // in pixels
uint HorizontalWidth, // in pixels
byte[] pBitmappedBuffer); // 1-bit per pixel image
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern IntPtr XIJET_LoadFontXFT( IntPtr PrinterHandle, // as returned from open call
List <char> filename); // full pathname to XFT font file
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_CanvasWriteStr( IntPtr PrinterHandle, // as returned from open call
IntPtr FontHandle, // as returned from XIJET_LoadFont
List <char> printString, // pointer to string to print
uint VerticalOffset, // in pixels
uint HorizontalOffset); // in pixels
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_CanvasPrint ( IntPtr PrinterHandle, // as returned from open call
uint Head1Offset, // Vertical offset in pixels
uint Head2Offset, // Vertical offset in pixels
uint Head3Offset, // Vertical offset in pixels
uint Head4Offset, // Vertical offset in pixels
uint Timeout ); // timeout in msecs
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_CanvasPrintExt2 ( IntPtr PrinterHandle, // as returned from open call
uint Head1Offset, // Vertical offset in pixels
uint Head2Offset, // Vertical offset in pixels
uint Head3Offset, // Vertical offset in pixels
uint Head4Offset, // Vertical offset in pixels
uint Timeout, // timeout in msecs
List<float> pTransportSpeedIPS); // Returned transport speed
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_WaitForPrintComplete( IntPtr PrinterHandle, // as returned from open call
uint Timeout); // Timeout in msecs
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern void XIJET_Reset( IntPtr PrinterHandle );
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern void XIJET_ResetPrintData(IntPtr PrinterHandle );
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern void XIJET_ResetPrintQueue(IntPtr PrinterHandle );
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_GetStatus( IntPtr PrinterHandle, // as returned from open call
IntPtr pStatusMessage); // returned text message
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_ActivatePens( IntPtr PrinterHandle );
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_DeactivatePens( IntPtr PrinterHandle );
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_SelectPens( IntPtr PrinterHandle, // as returned from open call
uint bmPensSelect ); // bit mapped pens selector
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_GetInkRemaining( IntPtr PrinterHandle, // as returned from open call
ushort headIndex, // zero-based index of head number
List<short> remainingPen1, // returned SHORT
List<short> remainingPen2,
List<short> remainingPen3,
List<short> remainingPen4);
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_ResetInkCartridge( IntPtr PrinterHandle, // as returned from open call
ushort headIndex, // zero-based index of head number
ushort penIndex); // zero-based index of pen number
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern int XIJET_QueueOutputToggle( IntPtr PrinterHandle, // as returned from open call
ushort outputIndex, // zero-based index of head number
ushort outputBitmask, // bit 0 = new state of output
ushort toggleTimeMS, // time in milliseconds (0=permanent)
ushort syncOption = 0, // 0 = immediate
ushort syncDelay = 0 ); // synchronize delay (time or distance)
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern IntPtr XIJET_OpenLogFile(String filename); // filename including full path;
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern void XIJET_CloseLogFile( );
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern uint XIJET_TestUSB( IntPtr PrinterHandle); // as returned from open call
[DllImport("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/XIJET_API.dll")]
public static extern double XIJET_GetVersionAPI( );
#endregion
public static void Main()
{
String Jour = DateTime.Now.Day.ToString();
String Mois = DateTime.Now.Month.ToString();
String Annee = DateTime.Now.Year.ToString();
String Log = "C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/" + Jour + "-" + Mois + "-" + Annee + ".txt";
IntPtr Fichier = XIJET_OpenLogFile(Log);
ushort index=0;
ImageConverter imageConverter = new ImageConverter();
Bitmap image=new Bitmap("C:/Users/Eren/documents/visual studio 2012/Projects/ConsoleApplication1/ConsoleApplication1/noir.bmp");
byte[] imageByte = (byte[])imageConverter.ConvertTo(image, typeof(byte[]));
uint Head1Offset=250;
uint Head2Offset=0;
uint Head3Offset=0;
uint Head4Offset=0;
uint Timeout=1000;
StringBuilder PrinterName=new StringBuilder();
XIJET_ProbePrinter(index, PrinterName);
Console.WriteLine(PrinterName+" son index est "+index);
ArrayList Configs = new ArrayList();
XIJET_CONFIGURATION Config0 = new XIJET_CONFIGURATION();
Configs.Add(Config0);
IntPtr ID_Printer= XIJET_OpenPrinter(PrinterName, Configs);
Console.WriteLine("Ouverture fichier " + Fichier);
Console.WriteLine("L'ID de l'imprimante: "+ID_Printer+" est ouverte");
uint XIJET_RESOLUTION = 2;
IntPtr parametre = new IntPtr();
//Console.WriteLine(ID_Printer + " " + XIJET_RESOLUTION + " " + parametre);
int test= XIJET_GetPrinterParameter(ID_Printer, XIJET_RESOLUTION, parametre);
Console.WriteLine("eureka "+parametre);
/* uint selection_cartouche = 0x01;
int activation_cartouche = XIJET_SelectPens(ID_Printer, selection_cartouche);*/
int retour = XIJET_ActivatePens(ID_Printer);
Console.WriteLine("Activation des cartouches: " + retour);
uint VerticalHeight=200,HorizontalWidth=200;
int Page=XIJET_PrintDocumentPage( ID_Printer,VerticalHeight,HorizontalWidth, imageByte, Head1Offset, Head2Offset, Head3Offset,Head4Offset, Timeout );
Console.WriteLine("Page chargée " + Page);
uint VerticalOffset=50, HorizontalOffset=50;
while (true)
{
XIJET_PrintDocumentPage(ID_Printer, VerticalHeight, HorizontalWidth, imageByte, Head1Offset, Head2Offset, Head3Offset, Head4Offset, Timeout);
}
uint usb = XIJET_TestUSB(ID_Printer);
Console.WriteLine("usb: "+usb);
XIJET_ClosePrinter(ID_Printer);
Console.WriteLine(XIJET_GetVersionAPI());
XIJET_CloseLogFile();
}
}
}
你有一个主意吗?文档的摘录是
int xijet_getPriNterParameter(句柄打印机手机,//返回从打开呼叫返回的 ushort参数index, PVOID PPARAMETER, ushort headNumber = 0);//当适用 回报:1 =成功 0 =错误 Xijet_getPriNterParameter将返回单个打印机配置参数。参数指示决定了哪个 参数将被返回,而PPARAMETER指向适当大小的内存字段。定义的常数 对于参数inderex,位于xijet_api.h中。可选的参数头缩写仅应包括 对于头部特定参数,例如触发偏移距离。 例如,读取打印机打印队列深度设置: int成功; 吸管价值; 成功= Xijet_getPrinterParameter(打印机,xijet_queue_depth和value); 有关可调打印机参数的列表,请参见附录A。
您可以在http://eren.atolgan.fr/kelenntechnology
与C doc的雅致,方法签名应为:
public static extern int XIJET_GetPrinterParameter(IntPtr printerHandle,
Uint16 parameterIndex,
IntPtr pParameter, UInt16 headNumber);
您可以在此处看到类型转换表:
http://msdn.microsoft.com/en-us/library/ac7ay120(v = vs.110).aspx
我本人挣扎着,但是我确实找到了一个解决方案:
Public Declare Function XIJET_SetPrinterParameter Lib "XIJET_API" (ByVal printerHandle
As IntPtr, ByVal parameterIndex As UShort, ByRef pParameter As UShort,
ByVal HeadNumber As UShort) As Short
相关文章:
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 堆栈溢出后调用SymSetOptions时发生AccessViolation
- Visual C#在调用包装的C++CLI dll中的Lapack时引发System.AccessViolation
- c# unmanaged PInvoke AccessViolation
- AccessViolation调试有趣
- AccessViolation仅在优化的Win32构建(XMMATRIX)
- 在c++中使用_tcstock时出现AccessViolation错误
- Cocos2d-x CCSprite->setDisplayFrame AccessViolation crash