调用C++;来自C#-结构的函数、指针、函数指针 我目前正在尝试将C++ DLL集成到我们的C语言应用程序中,但是我无法识别调用它们的方法的正确方法。
C++方法定义:调用C++;来自C#-结构的函数、指针、函数指针 我目前正在尝试将C++ DLL集成到我们的C语言应用程序中,但是我无法识别调用它们的方法的正确方法。,c#,c++,.net,dll,interop,C#,C++,.net,Dll,Interop,C++方法定义: typedef struct ImageDataAndInfo { unsigned char* PicBuffer; //image buffer long lPicSize; //image data length int iPicType; // iPicType, 0: bmp, 1: tiff, 2: jpeg } ImageDataAndInfo,*PImageDataAndInfo; typedef Im
typedef struct ImageDataAndInfo
{
unsigned char* PicBuffer; //image buffer
long lPicSize; //image data length
int iPicType; // iPicType, 0: bmp, 1: tiff, 2: jpeg
} ImageDataAndInfo,*PImageDataAndInfo;
typedef ImageAndScanError (__stdcall * ReadPictureData)(PImageDataAndInfo PicF1,
PImageDataAndInfo PicR1,
PImageDataAndInfo PicF2,
PImageDataAndInfo PicR2,
PImageDataAndInfo PicF3,
PImageDataAndInfo PicR3,
BOOL bSourceBMPSave);
typedef void (__stdcall * FreeImageDataBuffer)(PImageDataAndInfo pImageDataAndInfo);
C++示例代码:
ImageDataAndInfo F1,F2,F3,R1,R2,R3;
F1.lPicSize=0;
F2.lPicSize=0;
F3.lPicSize=0;
R1.lPicSize=0;
R2.lPicSize=0;
R3.lPicSize=0;
int bResult;
bResult=ReadPictureData(&F1,&R1,&F2,&R2,&F3,&R3,TRUE);
f_FreeImageDataBuffer(&F1);
...
f_FreeImageDataBuffer(&R3);
我的C#转换:
[StructLayout(LayoutKind.Sequential)]
public struct PImageDataAndInfo
{
[MarshalAs(UnmanagedType.ByValArray)]
public byte[] PicBuffer; //image buffer
public int lPicSize; //image data length
public int iPicType; // iPicType, 0: bmp, 1: tiff, 2: jpeg
}
[DllImport("ScanDll.dll", CallingConvention = CallingConvention.Winapi)]
public static extern ImageAndScanError ReadPictureData(
out PImageDataAndInfo PicF1,
out PImageDataAndInfo PicR1,
out PImageDataAndInfo PicF2,
out PImageDataAndInfo PicR2,
out PImageDataAndInfo PicF3,
out PImageDataAndInfo PicR3,
bool bSourceBMPSave);
PImageDataAndInfo PicF1 = new PImageDataAndInfo();
...
PImageDataAndInfo PicR3 = new PImageDataAndInfo();
ReadPictureData(
out PicF1,
out PicR1,
out PicF2,
out PicR2,
out PicF3,
out PicR3,
false);
如果我使用[marshallas(UnmanagedType.ByValArray,SizeConst=99999)]
为PicBuffer
指定默认值,我不会在lPicSize
中收到值,如果我没有指定默认值,我会在lPicSize
中得到一个值,但它不是PicBuffer
的正确值
我错过了什么 本机DLL正在为缓冲区分配内存,并在结构的
PicBuffer
字段中返回非托管指针。所以你的结构声明是错误的。您需要将字节数组声明为指针
[StructLayout(LayoutKind.Sequential)]
public struct ImageDataAndInfo
{
public IntPtr PicBuffer;
public int lPicSize;
public int iPicType;
}
必须调用才能将缓冲区的内容复制到字节数组。例如:
// call ReadPictureData
byte[] buffer = new byte[PicF1.lPicSize];
Marshal.Copy(PicF1.PicBuffer, buffer, 0, PicF1.lPicSize);
复制完所有缓冲区后,请确保调用FreeImageDataBuffer
。否则,您将泄漏本机DLL分配的内存
<>请注意,在C++代码中,<代码> IMAGATATAANDION<代码>为Strut,
ImageDataAndInfo
此外,不需要使用new
创建结构的新实例。就这样宣布吧:
ImageDataAndInfo PicF1;
ImageDataAndInfo PicF2;
// etc.
我做C++已经有一段时间了,但是IMO的C++代码声明了函数指针,而不是方法。