C#调用C++dll的函数类型转换问题。

问题描述

C++函数原型和参数说明QLIB_APIunsignedcharQLIB_GetAvailablePhonesPortList(unsignedshort*iNumPorts,unsignedshort*pPortList,unsignedshortiNumIgnorePorts,unsignedshort*pIgnorePortList)Parameters:iNumPorts=input/output,TheinputvalueisthemaximumnumberofentriesthatcanbeaddedtothepPortListarray.Theoutputvalueisupdatedtoreflecthowmanyvalidportswerefoundonthesystem.pPortList=output,unsignedchararray.EachunsignedcharindicatesaCOMportnumberthatisavailableonthesystem.iNumIgnorePorts=#ofportsinthe"ignoreportlist."ZerotocheckallportspIgnorePortList=alistofportnumbersthataretobeignored.Thiscanspeeduptheautodetectionofports.我在C#尝试个很多种类型,第二个参数都得不到正确的值,其他参数都正确。[DllImport(qmslDllName,SetLastError=true,CallingConvention=CallingConvention.Cdecl)]staticexternbyteQLIB_GetAvailablePhonesPortList(refushortiNumPorts,outbyte[]pPortList,ushortiNumIgnorePorts,byte[]pIgnorePortList);看C++的原型看出第一个和第二个参数的类型一样(unsignedshort*),但是参数说明表明,第一个参数是一个unsignedshort变量的地址,而第二个参数是一个unsignedshort数组的首地址,如果和第一个参数一个转换类型的话,只能得到数组的第一个值。比如我这样申明:[DllImport(qmslDllName,SetLastError=true,CallingConvention=CallingConvention.Cdecl)]staticexternbyteQLIB_GetAvailablePhonesPortList(refushortiNumPorts,refushortpPortList,ushortiNumIgnorePorts,byte[]pIgnorePortList);这样的话我第二个参数能获得一个正确的值,但是数组的其他值都得不到。请问前辈们,我应该怎么申明这个C#原型才可以获取到第二个参数的完整数组?

解决方案

解决方案二:
没有帮忙的吗?
解决方案三:

解决方案四:
有C的调用样列吗?不要去猜测。

时间: 2024-12-06 02:21:43

C#调用C++dll的函数类型转换问题。的相关文章

delphi-Delphi 调用C++ dll 回调函数

问题描述 Delphi 调用C++ dll 回调函数 用Delphi 调用容联云通信的动态库CCPAppClient.DLL,其中有一个函数 Function CCPinit( CallbackInterface: CCPCALLBACKINTERFACE ):Integer;stdcall; 参数CCPCALLBACKINTERFACE 是一个结构体指针,包含 onConnected , onConnectError 等回调函数. 在调用函数CCPinit调用成功后(返回值0),会触发CCPC

利用VC调用动态链接库中的函数

自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着,例如显示的字体和图标存储在GDI DLL中.显示Windows桌面和处理用户的输入所需要的代码被存储在一个User DLL中.Windows编程所需要的大量的API函数也被包含在Kernel DLL中.在Windows操作系统中使用DLL有很多优点,最主要的一点是多个应用程序.甚至是不同

delphi-求救!!! 调用一个DLL文件的函数,提供的调用方法好像是Delphi,VB怎么调用!

问题描述 求救!!! 调用一个DLL文件的函数,提供的调用方法好像是Delphi,VB怎么调用! 提供的调用方法如下 3.2 封装模式 接口动态库的文件名为nxmi.dll,HIS直接调用nxmi.dll, 调用之前请先安装读卡环境,安装程序为inst.exe. 3.3 调用方法 对外提供的接口函数: Procedure invoke(params :PChar; result : PChar) ; 我现在在VB中写的如下: 在模块下定义 Public Declare Function invo

c#调用DLL回调函数问题,硬盘录像机,NetSdk.dll,H264_DVR

问题描述 c#调用DLL回调函数问题,硬盘录像机,NetSdk.dll,H264_DVR 最近使用C#编写一个摄像头的本地监控及录像程序,硬件开发商把所有的功能实现封装到DLL里了,我通过C#调用之. 具体要实现的功能如下: 1.摄像头通过DAS功能,主动向监控主机的IP发送数据. 2.监控主机监听固定端口,处理接收到的数据. 我自己的思路: 1.新建一个Dictionary存储已上线设备的信息. 2.程序初始化H264_DVR_Init(DisCallback, 0),DisCallback为

c#调用c++dll函数时参数传递的问题?怎样正确传值?

问题描述 c#调用c++dll函数时参数传递的问题?怎样正确传值? 在c++项目cpptest.dll中定义: struct A { int X; int Y; }; extern "C" __declspec(dllexport) int fun1(A *a); int fun1(A *a) { return a->X; } 在C#项目中定义: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] class

在windows驱动代码中用汇编调用user32.dll中的MessageBoxA函数出错

问题描述 在windows驱动代码中用汇编调用user32.dll中的MessageBoxA函数出错 _asm { push eax; push ecx; push 0; push 0; push 0; push 0; mov ecx, MessageBoxAAddr; lea eax, mark; push eax; jmp ecx; mark: mov eax, eax; mov ebx, ebx; mov ecx, ecx; pop ecx; pop eax; } 其中MessageBox

求教个delphi调用DLL的函数说明怎么写

问题描述 求教个delphi调用DLL的函数说明怎么写 函数名 ZtDevice_CR_ReadTrack3 出口参数 byTrackDataThree BYTE * 3 出口参数 nDataThreeLen INT * 入口参数 nTimeOut INT 返回值 short 我的声明 unction ZtDevice_CR_ReadTrack2(out byTrackDataTwo:pBYTE; out nDataTwoLen:Integer;nTimeOut:integer):integer

C# 如何调用C++dll 类的成员函数?(请大家指教一二)

问题描述 C#如何调用C++写的MFCDLL中某一类的成员函数呢?eg...C++MFCDLL中有一个类的公共成员函数:CDllClass::icanseeu()...C#应用程序如何调用此函数....求助....先谢啦!!! 解决方案 解决方案二:实现不了解决方案三:C++自己调用都是问题,何况是其他语言解决方案四:实现不了.解决方案五:那怎么办,,,有没什么办法可以解决的...如果是一个C++的普通函数就可以调用的,(已实现)一个C++的类成员函数要怎么办?难不成把C++代码转换为C#代码?

请高手帮我解决一个VB.NET调用c++ DLL 中的回调函数的问题

问题描述 我有个test.dll是c++写的dll,现在我要用vb.net调用这个dll中的SetCallback回调函数,请问怎么在vb.net中实现,请高手们具体列出代码,应我是新手,谢谢.以下是c++中的头文件定义的一部分typedefvoid(__stdcall*CCallback)(unsignedlongmsg,unsignedlonghparam,unsignedlonglparam);extern"C"voidR888DLL_API__stdcallSetCallbac