c#调用c++.dll中函数参数问题,急求!!!泪奔~~~~~

k7ta 2008-01-07 04:25:02
在c#中调用dll中方法,目的是要得到struct数组中的数据
dll中函数签名如下:
[System.Runtime.InteropServices.DllImport("XXXXX.dll")]
public static extern char Test(byte[] ImBuf, int nr, int nc, out int nResult, LPRRecogRlt[] fwOcrRlt, int XXX);
其中LPRRecogRlt数据结构如下:
public struct LPRRecogRlt
{
public int ChLen ;
public char[] Code;
public int[] Score;
public int Type;
public int Color;
public int XLeft;
public int XRight;
public int YTop;
public int YBottom;
}
我的调用如下:
LPRRecogRlt[] fwOcrRlt = new LPRRecogRlt[5];
//初始化一些数据,不重要
for (int t = 0; t < fwOcrRlt.Length; t++)
{
fwOcrRlt[t].ChLen = 0;
fwOcrRlt[t].Type = 0;
fwOcrRlt[t].Color = 1;
fwOcrRlt[t].XLeft = 10;
fwOcrRlt[t].XRight = 10;
fwOcrRlt[t].YBottom = 20;
fwOcrRlt[t].YTop = 20;
fwOcrRlt[t].Code = new char[12];
fwOcrRlt[t].Score = new int[12];
}
//******************************

char result = Test(data, test.Height / 2, test.Width, out nresult, fwOcrRlt, 1);
运行是有如下问题:
未处理的异常: System.ArgumentException: 参数不正确。 (异常来自 HRESULT:0x800700
57 (E_INVALIDARG))
在 jpegtest.DLLMethod.FenWei_Car_Recog(Byte[] ImBuf, Int32 nr, Int32 nc, Int3
2& nResult, LPRRecogRlt[] fwOcrRlt, Int32 CarIndex)
在 jpegtest.testCarRecognition.testRec() 位置 D:\code\StationManagementSystem
\jpegtest\testCarRecognition.cs:行号 39
在 jpegtest.testCarRecognition.Main() 位置 D:\code\StationManagementSystem\jp
egtest\testCarRecognition.cs:行号 66
请按任意键继续. . .

求教各位大侠~~~,泪奔中







...全文
290 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
k7ta 2008-01-08
  • 打赏
  • 举报
回复
我已经解决问题了
问题出在一定要在引用dll方法的时候
方法签名的参数前面要加[in out]
也就是说如下:
public static extern char Test(byte[] ImBuf, int nr, int nc, out int nResult, [In, Out] LPRRecogRlt[] fwOcrRlt, int CarIndex);
数据结构如下:
[StructLayout(LayoutKind.Sequential)]
public struct LPRRecogRlt
{
[MarshalAs(UnmanagedType.I4,SizeConst=1)]
public int ChLen ;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public char[] Code;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public int[] Score;
[MarshalAs(UnmanagedType.I4, SizeConst = 1)]
public int Type;
[MarshalAs(UnmanagedType.I4, SizeConst = 1)]
public int Color;
[MarshalAs(UnmanagedType.I4, SizeConst = 1)]
public int XLeft;
[MarshalAs(UnmanagedType.I4, SizeConst = 1)]
public int XRight;
[MarshalAs(UnmanagedType.I4, SizeConst = 1)]
public int YTop;
[MarshalAs(UnmanagedType.I4, SizeConst = 1)]
public int YBottom;
}
调用如下
char result = DLLMethod.Test(data, test.Height / 2, test.Width, out nresult, fwOcrRlt, 1);
然后就OK了
zmaini1420 2008-01-07
  • 打赏
  • 举报
回复
UP!~~
k7ta 2008-01-07
  • 打赏
  • 举报
回复
恩,根据你给的数据类型对照,改了如下
public struct LPRRecogRlt
{

public Int32 ChLen ;
public Int16[] Code;
public Int32[] Score;
public Int32 Type;
public Int32 Color;
public Int32 XLeft;
public Int32 XRight;
public Int32 YTop;
public Int32 YBottom;
}
运行后如下问题:

未处理的异常: System.ArgumentException: 参数不正确。 (异常来自 HRESULT:0x800700
57 (E_INVALIDARG))
在 jpegtest.DLLMethod.FenWei_Car_Recog(Byte[] ImBuf, Int32 nr, Int32 nc, Int3
2& nResult, LPRRecogRlt[] fwOcrRlt, Int32 CarIndex)
在 jpegtest.testCarRecognition.testRec() 位置 D:\code\StationManagementSystem
\jpegtest\testCarRecognition.cs:行号 39
在 jpegtest.testCarRecognition.Main() 位置 D:\code\StationManagementSystem\jp
egtest\testCarRecognition.cs:行号 66
请按任意键继续. . .



changjiangzhibin 2008-01-07
  • 打赏
  • 举报
回复
BOOL=System.Int32
BOOLEAN=System.Int32
BYTE=System.UInt16
CHAR=System.Int16
COLORREF=System.UInt32
DWORD=System.UInt32
DWORD32=System.UInt32
DWORD64=System.UInt64
FLOAT=System.Float
HACCEL=System.IntPtr
HANDLE=System.IntPtr
HBITMAP=System.IntPtr
HBRUSH=System.IntPtr
HCONV=System.IntPtr
HCONVLIST=System.IntPtr
HCURSOR=System.IntPtr
HDC=System.IntPtr
HDDEDATA=System.IntPtr
HDESK=System.IntPtr
HDROP=System.IntPtr
HDWP=System.IntPtr
HENHMETAFILE=System.IntPtr
HFILE=System.IntPtr
HFONT=System.IntPtr
HGDIOBJ=System.IntPtr
HGLOBAL=System.IntPtr
HHOOK=System.IntPtr
HICON=System.IntPtr
HIMAGELIST=System.IntPtr
HIMC=System.IntPtr
HINSTANCE=System.IntPtr
HKEY=System.IntPtr
HLOCAL=System.IntPtr
HMENU=System.IntPtr
HMETAFILE=System.IntPtr
HMODULE=System.IntPtr
HMONITOR=System.IntPtr
HPALETTE=System.IntPtr
HPEN=System.IntPtr
HRGN=System.IntPtr
HRSRC=System.IntPtr
HSZ=System.IntPtr
HWINSTA=System.IntPtr
HWND=System.IntPtr
INT=System.Int32
INT32=System.Int32
INT64=System.Int64
LONG=System.Int32
LONG32=System.Int32
LONG64=System.Int64
LONGLONG=System.Int64
LPARAM=System.IntPtr
LPBOOL=System.Int16[]
LPBYTE=System.UInt16[]
LPCOLORREF=System.UInt32[]
LPCSTR=System.String
LPCTSTR=System.String
LPCVOID=System.UInt32
LPCWSTR=System.String
LPDWORD=System.UInt32[]
LPHANDLE=System.UInt32
LPINT=System.Int32[]
LPLONG=System.Int32[]
LPSTR=System.String
LPTSTR=System.String
LPVOID=System.UInt32
LPWORD=System.Int32[]
LPWSTR=System.String
LRESULT=System.IntPtr
PBOOL=System.Int16[]
PBOOLEAN=System.Int16[]
PBYTE=System.UInt16[]
PCHAR=System.Char[]
PCSTR=System.String
PCTSTR=System.String
PCWCH=System.UInt32
PCWSTR=System.UInt32
PDWORD=System.Int32[]
PFLOAT=System.Float[]
PHANDLE=System.UInt32
PHKEY=System.UInt32
PINT=System.Int32[]
PLCID=System.UInt32
PLONG=System.Int32[]
PLUID=System.UInt32
PSHORT=System.Int16[]
PSTR=System.String
PTBYTE=System.Char[]
PTCHAR=System.Char[]
PTSTR=System.String
PUCHAR=System.Char[]
PUINT=System.UInt32[]
PULONG=System.UInt32[]
PUSHORT=System.UInt16[]
PVOID=System.UInt32
PWCHAR=System.Char[]
PWORD=System.Int16[]
PWSTR=System.String
REGSAM=System.UInt32
SC_HANDLE=System.IntPtr
SC_LOCK=System.IntPtr
SHORT=System.Int16
SIZE_T=System.UInt32
SSIZE_=System.UInt32
TBYTE=System.Char
TCHAR=System.Char
UCHAR=System.Byte
UINT=System.UInt32
UINT32=System.UInt32
UINT64=System.UInt64
ULONG=System.UInt32
ULONG32=System.UInt32
ULONG64=System.UInt64
ULONGLONG=System.UInt64
USHORT=System.UInt16
WORD=System.UInt16
WPARAM=System.IntPtr
changjiangzhibin 2008-01-07
  • 打赏
  • 举报
回复
数据类型未转换好
【变分多谐波对偶模式追踪】从噪声信号中提取重复瞬态分量的方法(Matlab代码实现)内容概要:本文介绍了“变分多谐波对偶模式追踪”这一信号处理方法,旨在从含有噪声的信号中有效提取重复出现的瞬态成分。该方法结合了变分模态分解与多谐波分析的优势,通过构建对偶模式追踪模型,实现了对微弱瞬态特征的精准分离与增强,特别适用于机械故障诊断、生物医学信号处理等领域。文中详细阐述了算法原理、数学模型构建及其实现步骤,并提供了基于Matlab的代码实现,便于读者复现与应用。; 适合人群:具备一定信号处理基础,从事机械故障诊断、生物医学工程或相关领域的研究生及科研人员。; 使用场景及目标:①从强噪声背景中提取机械设备的周期性冲击信号以进行故障预警;②分析生物医学信号中的重复生理事件,如心电图或脑电图中的特定波形;③为需要高精度瞬态特征提取的研究提供可靠的算法支持与实现范例。; 阅读建议:此资源以Matlab代码实现为核心,不仅展示了算法的具体编程细节,还强调了理论与实践的紧密结合。学习者应在理解算法原理的基础上,动手运行并调试所提供的代码,通过改变参数观察结果变化,从而深入掌握该方法的应用技巧与优化策略。
内容概要:本文围绕“数据驱动下光伏建筑群源荷不确定性解析及其储能多目标低碳经济调度研究”展开,提出了一种融合数据驱动方法与多目标优化算法的综合调度框架。研究首先基于历史数据对光伏发电出力与建筑用电负荷的不确定性进行建模,通过场景生成与削减技术提取典型运行场景,并采用概率预测方法精确刻画源荷波动特征。在此基础上,构建了涵盖经济性、低碳性及系统运行稳定性等多重目标的储能优化调度模型,并引入NSGA-II等先进多目标进化算法求解Pareto最优解集,实现储能系统的协同优化与灵活调度。文中还基于Python语言完整实现了从数据预处理、不确定性建模、优化建模到算法求解的全流程,并通过具体仿真案例验证了所提方法在降低系统运行成本、提升可再生能源消纳水平、减少碳排放等方面的综合效益。; 适合人群:具备一定电力系统基础知识和Python编程能力,从事新能源调度、综合能源系统优化或低碳技术研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于光伏建筑群等分布式能源系统的储能优化调度;②支撑多目标优化在能源系统中的实践,实现经济与环保双重目标的平衡;③为相关课题研究提供可复现的代码框架与技术路线参考。; 阅读建议:建议读者结合文中提供的Python代码,深入理解不确定性建模、场景生成、多目标优化建模与求解的具体实现过程,并可通过调整参数或引入新模型进行拓展研究。

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧