C# 调用C++Dll函数问题

问题描述

原函数typdedefstructtagParam{charPort[3];charCtrlID[3];charParams[1024];charIPPort[5];charIPAddr[15];}unsignedshortOpenComm(Params&lParam,intsType)如下为我转换后的[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]privatestructParam{[MarshalAs(UnmanagedType.ByValTStr,SizeConst=3)]publicstringPort;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=3)]publicstringCtrlID;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=1024)]publicstringParams;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=4)]publicstringIPPort;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=15)]publicstringIPAddr;}privateshortsType=401;[DllImport("CM60.dll")]privatestaticexternshortOpenComm(refParampar,shortstype);publicshortOpen(){Parampar=newParam();par.Port="003";returnOpenComm(refpar,sType);}在调用Open()方法时一直不成功,请各位帮一下忙呀。不好意思没分了给我的点少哈

解决方案

解决方案二:
1、Param怎么定义的?
解决方案三:
同样碰到的问题,启发很大啊
解决方案四:
int32short16
解决方案五:
int还是int··
解决方案六:
提示啥错误?调用约定设置下试试
解决方案七:
我觉得应该是byte[]
解决方案八:
字符串后面会加个结尾,看看是不是这个原因
解决方案九:
[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]publicstructParam{[MarshalAs(UnmanagedType.ByValArray,SizeConst=3)]publicbyte[]Port;[MarshalAs(UnmanagedType.ByValArray,SizeConst=3)]publicbyte[]CtrlID;[MarshalAs(UnmanagedType.ByValArray,SizeConst=6)]publicbyte[]Params;[MarshalAs(UnmanagedType.ByValArray,SizeConst=4)]publicbyte[]IPPort;[MarshalAs(UnmanagedType.ByValArray,SizeConst=15)]publicbyte[]IPAddr;}[DllImport("CM60.dll")]privatestaticexternshortOpenComm(refParampar,shortstype);[DllImport("CM60.dll")]privatestaticexternshortCloseComm(refParampar,shortstype);[DllImport("CM60.dll")]privatestaticexternshortSearchCtrl(refParampar,shortstype);[DllImport("CM60.dll")]privatestaticexternshortCollect20(refParampar,shortstype);[DllImport("CM60.dll")]privatestaticexternshortGetNewRecordCount(refParampar,shortstype);publicParampar=newParam();privateshortsType=100;privatevoidbtnReadRecord_Click(objectsender,EventArgse){par.Port=newbyte[]{0x30,0x30,0x31};par.CtrlID=newbyte[]{0x30,0x30,0x31};par.Params=newbyte[]{0x31,0x39,0x32,0x30,0x30,0x3B};shortsh=0;par.Port[2]=Convert.ToByte(48+Convert.ToInt16(cbPort.Text.Substring(3)));sh=OpenComm(refpar,sType);if(sh==105)MessageBox.Show("OK");elseMessageBox.Show(sh.ToString());sh=SearchCtrl(refpar,sType);if(sh==105)MessageBox.Show("OK");elseMessageBox.Show(sh.ToString());sh=CloseComm(refpar,sType);if(sh==105)MessageBox.Show("OK");elseMessageBox.Show(sh.ToString());}

时间: 2024-10-30 14:20:35

C# 调用C++Dll函数问题的相关文章

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

c#调用自定义matlab函数

问题描述 c#调用自定义matlab函数 我使用matlab编辑了一个计算卷积的函数. 输入的变量如下 function R = reliability( range,q1,q2,b1,b2,k1,k2,l1,l2 ) 计算之后,返回一个数组. 用matlab编译成.dll文件,在VS使用c#调用时遇到以下问题 首先,变量中出现了一个我没有定义过的int numArgsOut,不知道是哪里来的,而我定义的l2不存在了: 其次,我如何把这个object变量中的数组读取出来放到一个数组里面? 谢各位

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

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

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

在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

对于已经写好的.dll,没有头文件能调用里面的函数吗?

问题描述 最近在研究些逆向相关的东西,这是个unity3d的手游,其资源都有加密,现在发现的是,在assembly.dll里有相应的加密.解密函数,想要直接调用这些.dll文件里的解密函数去解密资源,要怎么做? 解决方案 解决方案二:DLL也要区分托管和非托管的,即使知道了调用方法,但不知道参数的意义也是没有用的.解决方案三:可以用loadlibrary动态加载调用.解决方案四:引用2楼caozhy的回复: 可以用loadlibrary动态加载调用. 试过用loadlibrary加载但是用例程里

C#调用带有回调函数的DLL的问题 !!!!急!!!!!!

问题描述 //------------dll中的回调函数---------------voidkinescope(void(*kines)(floatx,floaty)){D3DXVECTOR3vec=d3d->GetCamera()->GetPos();kines(vec.x,vec.y); //----------------C#中调用代码---------------//------------委托声明-------------publicdelegatevoidkinds(floatx

调用C++dll,需要传入一个函数指针,函数参数含有数组指针,用于传回数据,怎么老说我访问内存非法呀.

问题描述 C++dll代码回掉函数类型:voidcallback(BYTE*data,intnlen)//DLL设置回调函数voidSetCallBackFunc(CALL_BACK_FUNCcallback){m_callback=callback;}//dll调用回掉函数向C#传回数据voidStartDll(){BYTEbtData[100];for(bytei=0;i<100;i++){btData[i]=i;}m_callback(btData,100);//将数据通过回掉函数传回C#

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

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