c++-C# 托管的 PInvoke 签名与非托管的目标签名不匹配

问题描述

C# 托管的 PInvoke 签名与非托管的目标签名不匹配

CLIENT_API BOOL CALL_METHOD CLIENT_SnapPicture(LLONG lLoginID, SNAP_PARAMS par);

typedef struct _snap_param
{
unsigned int Channel;
unsigned int Quality;
unsigned int ImageSize;
unsigned int mode;
unsigned int InterSnap;
unsigned int CmdSerial;
unsigned int Reserved[4];
} SNAP_PARAMS, *LPSNAP_PARAMS;

[DllImport("dhnetsdk.dll")]
public static extern bool CLIENT_SnapPicture(int lLoginID, SNAP_PARAMS par);

[StructLayout(LayoutKind.Sequential)]
public struct SNAP_PARAMS
{
public uint Channel;
public uint Quality;
public uint ImageSize;
public uint mode;
public uint InterSnap;
public uint CmdSerial;
public uint Reserved;
};

解决方案

函数原型定义有问题,问厂家要开发文档。

时间: 2024-10-31 01:47:55

c++-C# 托管的 PInvoke 签名与非托管的目标签名不匹配的相关文章

C# 调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配

原文:C# 调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配 在dllimport中加入CallingConvention参数就行了,[DllImport(PCAP_DLL, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]

函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。

原文:函数调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配. 在dllimport中加入CallingConvention参数就行了,[DllImport(PCAP_DLL, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] 要注意C++与NET中数据类型的对应:   //c++:char * ---- c#:string //传入参数   //c++:char * ---

托管的 PInvoke 签名与非托管的目标签名不匹配

问题描述 C++代码:BOOL__stdcallHik_PlayM4_OpenFile(LONGnPort,LPSTRsFileName);C#:[DllImport("HikPlayM4.dll",CallingConvention=CallingConvention.StdCall)]//publicexternstaticboolHik_PlayM4_OpenFile(longnPort,[MarshalAs(UnmanagedType.LPStr)]stringsFileNam

c#- 托管DLL无法加载非托管Dll,怎么办?

问题描述 托管DLL无法加载非托管Dll,怎么办? 比如报错,"无法加载 DLL"libcurl.dll": 找不到指定的模块" 我已经引用了托管DLL libcurlNET.dll,这个托管DLL需要引用libcurl.dll,两个DLL已经放在了同一个目录下,还是报错,请指点·· 解决方案 C#用不着这个库,你直接用httpwebrequest就可以了. 解决方案二: htttprequest 效率低 解决方案三: 托管调用非托管的DLL编写C++非托管DLL以

原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配

问题描述 依时利读卡器二次开发Demo我要用C#读依时利的读卡器,给的是Delphi的Demo,想把它转成C#的,代码如下:publicstructTERTradeParam{publicstringIndexSectorPwdA;//="A0A1A2A3A4A5";publicstringConsumePwd;//="000000000000";publicstringChargePwd;//="111111111111";publicstri

如何在ubuntu下编译APK,这个APK的签名为非原生应用的签名?

问题描述 如题,想在ubuntu下编译一个APK,因为这个APK里要用到系统的一些代码,可是我不希望这个APK的签名为系统签名,如何做到?一般情况下编好后都是在out/...system/app下,而且只要你有手机的权限,就可以push apk到手机system/app下.我只是希望能编一个类似第三方的APK,如何做到?求大神解决. 问题补充:MyEyeOfJava 写道 解决方案 做自己的keystore文件,重新对APK进行签名~

c++.net 托管类封装非托管类

C++.net中非托管的代码虽然在托管里面可以直接使用,但是有时候却会被限制.比如当需要用托管里面的 ArrayList 存储一个非托管的对象的时候就需要用一个托管的类把这个非托管的类封装一下,其他的封装的原因我也没想到,刚开始接触c++.net,基本是需要什么学什么,我是这个原因才去封装的.   比如一个非托管的类如下 class serverInfo { public: serverInfo(); ~serverInfo(); string CSTR_DBIPADDRESS; //数据库ip

.NET简谈互操作(四:基础知识之Dispose非托管内存)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之Dispose非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用)  .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习.前一篇文章中我们学习了基础知识中的DllImport关键特性:我们继续学习基础知识中的内存释放相关技术

调用非托管dll常出现的bug及解决办法

C和C++有很多好的类库的沉淀,在.NET中,完全抛弃它们而重头再来是非常不明智的.也是不现实的,所以,我们经常需要通过Pinvoke来使用以前遗留下来的非托管的dll.就.NET中使用非托管的dll经验而言,经常碰到的问题至少有两个,它们都是通过在运行时抛出异常来体现的. 1.试图加载格式不正确的程序 出现这种异常,通常是.NET应用程序的"目标平台"与非托管dll的平台不一样. 一般,在使用VS开发.NET的应用程序和类库时,默认的目标平台为"Any CPU",