C#调用C++函数 函数没有返回值。

图片说明
图片说明
图片说明
我创建了ocx控件 ,想通过C#窗体调用这个ocx 函数调用了 我想测试一下,C++函数为高斯投影函数,我想计算出后面两个值 ,具体该怎么调用出。之前的C++函数是没有返回值的。

3个回答

把ref换成out看看

Moses_john
Moses_john 试过了 out没有用(⊙﹏⊙)~
3 年多之前 回复

C++函数怎么定义的,是传指针还是怎么返回的?要看C++的接口。

Moses_john
Moses_john 您帮我看一下楼下 ,就是那个C++函数 ,里面的是指针。
3 年多之前 回复

图片说明
C++函数这么定义的 里面有指针。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C#调用C++函数 函数没有返回值。
![图片说明](https://img-ask.csdn.net/upload/201610/24/1477272744_300511.jpg) ![图片说明](https://img-ask.csdn.net/upload/201610/24/1477272760_254684.jpg) ![图片说明](https://img-ask.csdn.net/upload/201610/24/1477272773_68342.jpg) 我创建了ocx控件 ,想通过C#窗体调用这个ocx 函数调用了 我想测试一下,C++函数为高斯投影函数,我想计算出后面两个值 ,具体该怎么调用出。之前的C++函数是没有返回值的。
C#调用WritePrivateProfileString函数进行ini文件写入值写不进去
如题。 使用C#调用WritePrivateProfileString函数进行ini文件写入 函数返回true,但是ini文件里面啥也没有。
C#中如何接收python函数的中文字串返回值?
C#winform的调用python程序的过程中,如果python函数的返回值中有中文,在C#中应当如何接收?
C#调用C++函数,参数为指针该怎么处理?
我用C#调用C++的函数 SetRecogID(int *idList,int len) 在C#中该怎么接收处理? [DllImport(DLLName, EntryPoint = "SetRecogID", CharSet = CharSet.Unicode)] public static extern int pSetRecogID(?); 括号里的参数该写成什么类型的? public int SetRecogID(?) { 拿到值以后直接返回吗?还是这里需要处理一下 return pSetRecogID(?); } 网上查的说法太多没看明白,求大神指教! ![图片说明](https://img-ask.csdn.net/upload/201903/15/1552614520_27250.jpg) ![图片说明](https://img-ask.csdn.net/upload/201903/15/1552614511_453291.jpg)
如果在C中调用C#函数并获取字符串的返回值给C。
把C#的委托给C,这个可以正常,但是C想要通过这个委托拿到C#的字符串值 要怎么做? C# ``` [UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate void GetStrCallback(StringBuilder str); [DllImport("...")] public extern static void SetStrCallback(GetStrCallback cb); ... public static void Handle(StringBuilder str) { str.Append("AAAAAA"); } SetStrCallback(Handle); ``` C ``` c# typedef void(__stdcall * GetStrCallback)(const char* str); GetStrCallback _getStrFunc = NULL; extern __declspec(dllexport) void SetStrCallback(GetStrCallback cb) { _getStrFunc = cb; } ... void GetCSharpStr() { char temStr[1024] = ""; _getStrFunc(temStr); // 调用C#的函数,但是temStr还是空的,咋整? } ```
C#调用C++ Dll 返回信息与C++返回结构体中信息不一致?
各位大佬,小弟遇到一个很难理解的问题,情况如下: C++ 开发的Dll和硬件通讯,在C++中使用返回正常的数值,而在C#中通过DllImport方式调用,发现返回的数值不一致,具体代码如下: ** C++ 提供的结构体:** ``` typedef struct _SXPSERVER { BYTE bNodeaddr[6]; DWORD dwIp; char szMachineType[16]; char szHostName[16]; } SXPSERVER, *LPSXPSERVER; ``` ![图片说明](https://img-ask.csdn.net/upload/202003/09/1583717423_841994.png) **C# 自己写的DllImport 的结构体** ``` [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct SXPSERVER { public uint dwIp; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6, ArraySubType = UnmanagedType.I1)] public byte[] bNodeaddr; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string szMachineType; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string szHostName; } ``` ![图片说明](https://img-ask.csdn.net/upload/202003/09/1583717435_345718.png) 调用全部都一切正常,结构体中也能够返回值,现在就是这个DWORD dwIp; 转换到C#中的 public uint dwIp;返回不一样,其他的都没有问题,请问各位大佬,我这个转换不对吗?查了半天看到的对应转换关系都是DWORD -》uint,我改成了int同样也是不对,这个咋整,这个值还会是后面的函数中的关键参数,卡到这里进行不下去了。 PS:看到有大神留言说这个参数位置写反了,我最开始的时候就是按照这个顺序( ``` [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct SXPSERVER { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6, ArraySubType = UnmanagedType.I1)] public byte[] bNodeaddr; public uint dwIp; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string szMachineType; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string szHostName; } ``` )来的,出来的结果和这个是一样的 **问题已经解决了,解决的方式是这样的:** 我在C++的结构体与C#定义的结构体的顺序是不一样的,但这个不是主要的原因。而是我调用方式有问题。我把c#实现的这个结构体单独放到了一个DLL中,然后再通过别的工程去调用这个DLL,这样的话。不管结构体中的顺序是什么,它都能够调用成功,但是他成功之后,里面的数值是不对的,这个是我通过反编译看到的,所有的结构体变量约束都没有了,所以这个值肯定不对啦。而我把这个调用C++的这个结构体直接放到了我现在用的工程当中,按照错误的顺序,这个方法都不会调用成功,而按照正确的顺序后就ok啦!
C#调用dll,使用intPtr接收char*返回值不一致
在C#中调用C的dll,遇到char* 使用 intPtr接收,返回值与C中char 指针不一致 C结构体 typedef struct { BYTE ErrCode; int* errstring; } ERRPARAMS; 函数 BYTE DSCUDAPICALL dscGetLastError(ERRPARAMS* errparams); C#结构体 [StructLayout(LayoutKind.Sequential)] public struct ERRPARAMS { public byte ErrCode; public IntPtr errstring; } 函数 [DllImport("dscud.dll", EntryPoint = "dscGetLastError", CharSet = CharSet.Unicode, SetLastError = false, CallingConvention = CallingConvention.Cdecl)] extern unsafe public static byte dscGetLastError(ERRPARAMS* errparams); 执行结果: 在C中 ErrCode是5 errstring是0x1007eb80 可以转换成字符串 在C#中 ErrCode是5 errstring是0x00000010 使用Marshal.PtrToStringAnsi转换为空,不是想要的地址 将intPtr改成string/String/StringBuilder/char[]都试过了,函数会报内存异常的错误。 且大神解答,非常感谢。
C#调用MFCdll里面的回调函数
.h文件如下 #include "StdAfx.h" #ifdef RTWRE_EXPORTS #define RTWRE_API __declspec(dllexport) #else #define RTWRE_API __declspec(dllimport) #ifdef _DEBUG #pragma comment(lib,"FunctionDll.lib") #else #pragma comment(lib,"FunctionDll.lib") #endif #endif //int MarkID——标志点ID号,1——角点,2——边点 //向量 double Va, double Vb, double Vc typedef void (CALLBACK * CHECKCLCFUNCTION) (int MarkID, double Va, double Vb,double Vc); CHECKCLCFUNCTION m_pCheckFunction; //回调函数指针 //返回input+2 extern "C" RTWRE_API int FDllTest(int input); //设置回调函数 /* SetCheckFunctionPoint 功 能 设置回调函数。 格 式 void SetCheckFunctionPoint(CHECKFUNCTION1 pCheckFuntion); 参 数 CHECKFUNCTION1 pCheckFuntion 回调函数名,具体定义见回调函数说明 返 回 值 无 */ extern "C" RTWRE_API void SetCheckFunctionPoint(CHECKCLCFUNCTION pCheckFuntion); 具体调用的函数如下 ![图片说明](https://img-ask.csdn.net/upload/201712/12/1513073186_707668.jpg) C#代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices; namespace CSharpCallBackC { //FunctionDll.dll [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void ControlData(int a, double b,double c,double d); [DllImport(@"FunctionDll.dll", EntryPoint = "SetCheckFunctionPoint", CallingConvention = CallingConvention.Cdecl)] public partial class Form1 : Form { public Form1() { InitializeComponent(); } } } 主要问题在于最后声明函数的时候不会写,在 public static extern 语句后面总会报错,还有就是如果使用结构体应该怎么写。
C#调用C++和opencv生成的dll库文件,其中函数中带有指针
大家好,我用C#调用C++的dll,其中一个函数中有指针,参数的定义在C++中是一个结构体,但是我现在遇到的问题是无法获取托管类型的地址和大小,或无法声明指向它的指针,下面我把这个函数在C++中的定义和我自己转到C#中的定义给大家贴出来,大家帮帮忙,本人属于C++和C#新手。 C++ 1. int THFI_Create (short nChannelNum,THFI_Param* pParam) 功能:初始化THFaceImage SDK,只需在应用程序初始化时调用一次 参数: nChannelNum,通道数,用于多线程的通道,每个线程对应一个通道. 每个线程使用的通道ID从0到nChannelNum-1,如通道数为4,那么每个线程使用的合法通道ID为0,1,2,3 pParam,算法参数 返回值: Int整型,返回实际成功初始化的通道数 struct THFI_Param { int nMinFaceSize;//min face width size can be detected,default is 50 pixels int nRollAngle;//max face roll angle,default is 30(degree) bool bOnlyDetect;//only detect face or not(if it's true,only Detect API is enable,Feature API is disable),defaule is false(Detect API is enable,and Feature API is enable) DWORD dwReserved;//reserved value,must be NULL THFI_Param() { nMinFaceSize=50; nRollAngle=30; bOnlyDetect=false; dwReserved=NULL; } }; C# [StructLayout(LayoutKind.Sequential)] public struct THFI_Param { [FieldOffset(0)] public Int16 nMinFaceSize; [FieldOffset(2)] public Int16 nRollAngle; [FieldOffset(4)] public Boolean bOnlyDetect; [FieldOffset(6)] public UInt32? dwReserved; }; [DllImport("THFaceImage.dll", EntryPoint = "THFI_Create", CharSet = CharSet.Auto)] unsafe static extern int THFI_Create(Int16 nChannelNum, THFI_Param* pParam); THFI_Create显示错误 CS0208: 无法获取托管类型(“WindowsFormsApplication1.Form1.THFI_Param”)的地址和大小,或无法声明指向它的指针。
c#调用DLL回调函数问题,硬盘录像机,NetSdk.dll,H264_DVR
最近使用C#编写一个摄像头的本地监控及录像程序,硬件开发商把所有的功能实现封装到DLL里了,我通过C#调用之。 具体要实现的功能如下: 1、摄像头通过DAS功能,主动向监控主机的IP发送数据。 2、监控主机监听固定端口,处理接收到的数据。 我自己的思路: 1、新建一个Dictionary存储已上线设备的信息。 2、程序初始化H264_DVR_Init(DisCallback, 0),DisCallback为断线回调函数,设备断线后将设备信息从Dictionary剔除。 3、程序通过调用DLL中的H264_DVR_StartActiveRigister(port, ActiveRegCallBack, 0))方法开始监听端口,ActiveRegCallBack为设备上线后的回调函数,能够得到上线设备的信息。 遇到的问题: 现在程序能够正常的运行,设备发送数据也能接受并显示,但是如果有一个已连接的设备断线后,当这个设备再次连接时或新设备上线时程序就崩溃,显示VSHOST32.EXE已停止工作,即使关闭项目属性中“启用visual studio承载进程”后也会崩溃。 现将部分代码贴上,感谢大神!跪谢! //---------------------------------------------------------------------------------------------------- //初始化SDK public void InitSDK() { DisCallback = new XMSDK.DisConnectCallBackDelegate(DisConnectBackCall); GC.KeepAlive(DisCallback); if (XMSDK.H264_DVR_Init(DisCallback, 0)) { Console.Write(NowTime() + "系统初始化,成功!"); 系统实时信息.AppendText(DateTime.Now.ToLongDateString().ToString() + DateTime.Now.ToLongTimeString().ToString() + " : " + "系统初始化,成功!"); File.AppendAllText(LogSavePath, NowTime() + "系统初始化,成功!", Encoding.UTF8); } else { Console.Write(NowTime() + "系统初始化,失败!"); 系统实时信息.AppendText(NowTime() + "系统初始化,失败!"); File.AppendAllText(LogSavePath, NowTime() + "系统初始化,失败!", Encoding.UTF8); } } //---------------------------------------------------------------------------------------------------- //断线回掉函数,输出断线信息,停止RealPlay、PC端录像 void DisConnectBackCall(int lLoginID, string pchDVRIP, int nDVRPort, IntPtr dwUser) { ActiveRegListStruct ActiveRegListOne; ActiveRegList.TryGetValue(lLoginID, out ActiveRegListOne); Message = new MessageStruct(); Message.msg = "设备:" + ActiveRegListOne.RasID + "(" + ActiveRegListOne.SerialNumber + ")" + ",断线!"; ShowMessage(); if (XMSDK.H264_DVR_StopLocalRecord(ActiveRegListOne.RealPlayID)) { ActiveRegListOne.RecordingTime = -1; Message = new MessageStruct(); Message.msg = "设备:" + ActiveRegListOne.RasID + "(" + ActiveRegListOne.SerialNumber + ")" + ",停止PC端录像!"; ShowMessage(); } if (XMSDK.H264_DVR_StopRealPlay(ActiveRegListOne.RealPlayID, (uint)ActiveRegListOne.Handle)) { ActiveRegListOne.RealPlayID = -1; Message = new MessageStruct(); Message.msg = "设备:" + ActiveRegListOne.RasID + "(" + ActiveRegListOne.SerialNumber + ")" + ",停止实时监视!"; ShowMessage(); } if (ActiveRegList.ContainsKey(lLoginID)) { ActiveRegList.Remove(lLoginID); } AddToTreeView(); } //---------------------------------------------------------------------------------------------------- //设备主动注册 public void StartActiveRigister() { int port = 9300; ActiveRegCallBack = new XMSDK.ActiveRigisterCallBackDelegate(ActiveRigisterCallBack); if (XMSDK.H264_DVR_StartActiveRigister(port, ActiveRegCallBack, 0)) { PrintMessage("远程设备主动注册监听,成功!"); PrintMessage("开始监听:" + port.ToString() + "端口,等待设备连接。"); } else { PrintMessage("远程设备主动注册监听开始,失败!"); } } //---------------------------------------------------------------------------------------------------- //主动监听回调函数 public void ActiveRigisterCallBack(int lLoginID, IntPtr pBuf, uint dwBufLen, uint dwUser) { H264_DVR_ACTIVEREG_INFO ActiveClientInfo; ActiveClientInfo = (H264_DVR_ACTIVEREG_INFO)Marshal.PtrToStructure(pBuf, typeof(H264_DVR_ACTIVEREG_INFO)); if (ActiveRegList.Count < 6) { ActiveRegListStruct ActiveRegListOne; ActiveRegListOne.LoginID = lLoginID; ActiveRegListOne.RasID = ActiveClientInfo.deviceSarialID; ActiveRegListOne.SerialNumber = ActiveClientInfo.deviceInfo.sSerialNumber; ActiveRegListOne.VideoOutChannel = ActiveClientInfo.deviceInfo.iVideoOutChannel; ActiveRegListOne.deviceInfo = ActiveClientInfo.deviceInfo; ActiveRegListOne.RealPlayID = -1; ActiveRegListOne.RecordingTime = -1; ActiveRegListOne.isSetKeepLifeTime = XMSDK.H264_DVR_SetKeepLifeTime(lLoginID, 1, 1 * 2); ActiveRegListOne.Handle = HandleArray[ActiveRegList.Count]; ActiveRegList.Add(lLoginID, ActiveRegListOne); NowActiveReg = ActiveRegListOne; //---------------------------------------------------------------------------------------------------- //更新设备列表TreeView AddToTreeView(); //---------------------------------------------------------------------------------------------------- //开始RealPlay和PC端录像 StartRealPlayLocalRecord(); } else { MessageBox.Show("当前连接数过多,本系统最多支持6个通道连接!"); } } class XMSDK { public delegate void DisConnectCallBackDelegate(int lLoginID, string pchDVRIP, int nDVRPort, IntPtr dwUser); //断线回调函数,回调出当前已经断开的设备 public delegate void ActiveRigisterCallBackDelegate(int lLoginID, IntPtr pBuf, uint dwBufLen, uint dwUser); [DllImport("NetSdk.dll")] public static extern bool H264_DVR_Init(DisConnectCallBackDelegate cbDisConnect,uint dwUser); //SDK初始化 [DllImport("NetSdk.dll")] public static extern bool H264_DVR_StartActiveRigister(int nPort, ActiveRigisterCallBackDelegate cbFunc, uint dwDataUser); //远程设备主动注册监听 [DllImport("NetSdk.dll")] public static extern bool H264_DVR_StopActiveRigister(); //远程设备主动注册监听 [DllImport("NetSdk.dll")] public static extern int H264_DVR_RealPlay(int lLoginID, ref H264_DVR_CLIENTINFO lpClientInfo); [DllImport("NetSdk.dll")] public static extern bool H264_DVR_StopRealPlay(int lLoginID, uint dwUser); [DllImport("NetSdk.dll")] public static extern bool H264_DVR_StartLocalRecord(int lRealHandle, string szSaveFileName, int type); [DllImport("NetSdk.dll")] public static extern bool H264_DVR_StopLocalRecord(int lRealHandle); [DllImport("NetSdk.dll")] public static extern bool H264_DVR_SetKeepLifeTime(int lLoginID, int perKeeplifeTime, int detectDisconTime); [DllImport("NetSdk.dll")] public static extern int H264_DVR_GetLastError(); [DllImport("NetSdk.dll")] public static extern bool H264_DVR_Cleanup(); } public struct ActiveRegListStruct { public int LoginID; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public String RasID; //RAS-ID 类似于laizhou [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public String SerialNumber;//设备序列号 MAC地址 唯一标识符 public int VideoOutChannel; //单个设备输出通道数 public bool isSetKeepLifeTime; //设置心跳时间是否成功的返回值,1 成功,0 失败 public int RealPlayID; //执行RealPlay方法的返回值,用于LoaclRecord public int RecordingTime;//显示已录像多长时间,-1为没有开始录像 public IntPtr Handle; //Handle public H264_DVR_DEVICEINFO deviceInfo; } //---------------------------------------------------------------------------------------------------- //已连接的设备列表 public static Dictionary<int, ActiveRegListStruct> ActiveRegList = new Dictionary<int, ActiveRegListStruct>();
请教一个关于c++DLL供C#调用的代码,是否会出现内存泄漏的问题
``` const char* __stdcall abc(const char* data) { int size = strlen(data); string s = ""; for (int i = 0; i < size; i++) { s += data[i]; } return s.c_str(); } ``` 本人做c#,现在需要用c++实现一些内容,传入参数和返回参数都是指针,在c++的DLL中,定义了一些变量,在C#中我通过Intptr来获取返回值,上面的函数模拟了大概的内容,对c++中内存泄漏问题没有经验,这样在c#调用,会造成内容泄漏问题么,c#中的Intptr是不需要释放的吧
C# 新建线程递归调用包含回调函数,怎么判断递归调用结束,获取返回值
如题,在新建线程中递归调用函数,一次结果的返回值由回调函数获取,我想根据线程的状态判断 递归调用是否结束,并获取正确返回值,但是一次执行后线程状态就变成了Stopped了,回调 函数还在继续执行,用什么标记回调函数执行结束呢?
C#调用C++DLL时char *类型参数的值不会变,求支招。
我用C++做了一个DLL,code如下: char* ReadString(const char *sec, const char *key,char *def, const char *file) { ZeroMemory(strReturnValue,sizeof(strReturnValue)); int i = GetPrivateProfileString(sec, key, "",strReturnValue, 2048, file); def = &strReturnValue[0]; return strReturnValue; } 然后用C#来调用这个函数,code如下: [MarshalAs(UnmanagedType.LPStr)] StringBuilder def; private void button1_Click(object sender, EventArgs e) { string a = "No data exsit."; def = new StringBuilder(a); string file = Environment.CurrentDirectory + "\\uConfig.ini"; string aa = iFunction.ReadString("Config", "MesDB", def, file); } 不知道为什么这个char *def的值就是改变不了,一直为a, 但ReadString方法的返回值是正常的,求支招。
C#中 使用windowsAPI writefile函数 返回一直FALSE
RT 项目需要 能够在SD卡的指定偏移位置写入数据,因此使用windowsAPI的 writefile函数 引用了kernel32.dll 转换的数据类型结果如下 [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "WriteFile", SetLastError = true, ThrowOnUnmappableChar = true)] [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] public static extern unsafe bool WriteFile ( System.IntPtr hFile, void* lpBuffer, uint nNumberOfBytesToWrite, uint* lpNumberOfBytesWritten, int lpOverlapped ); 用createfile方法 以物理形式访问SD卡访问模式 为GENERIC_READ|GENERIC_WRITE,共享模式为FILE_SHARE_WRITE. 但最后调用的时候 总是写不进去 返回值始终为false 求大侠们指点!!!!!!!!
LUA 读取C#中返回值为数组的函数
请教大师们,一个问题:我在C#中写了一个返回值为数组的函数float[] data_handle1() ,想在Lua中调用此函数?在lua 中如何操作读取这个函数的返回值呢?C# 的函数具体代码如下: public float[] data_handle1() //串口20个字节回复字节解析 { ……………………………………………………………… float[] i = new float[8]; int p = 0; for (int loop = 2; loop < 18; loop++) { i[p] = data[loop] * 256 + data[loop + 1]; loop = loop + 1; p++; } return i; } 在lua中的代码如下: local k={n=8} local t={n=8} k = data_handle1() for i=1,8,1 do t[i]=k[i] MessageBox("未收到返113351") end 运行到读取K值时就一直报错,请问怎么写
C#调用C++ dll的API怎么去调用他的函数啊?
``` c++ 给我的文档里面写的 typedef void* IPC_DEV_HANDLE; typedef void** PIPC_DEV_HANDLE; 初始化方法: DWORD Initialize(void) 返回值说明: BSIPC_EX_SUCCESS 成功 BSIPC_EX_ERROR 错误 打开设备 DWORD OpenIpc(PIPC_DEV_HANDLE bsDev, DWORD bsFlag) 参数说明: bsFlag [in] 参数,可能的取值如下: OPEN_FIRST 打开第一个 OPEN_SECOND 打开第二个 返回值说明 BSIPC_EX_SUCCESS 成功 ``` 我想知道 他说的返回值 我不知道是字符串还是什么 我这边调用返回的是0 而且 第二个的参数 是传 "``OPEN_FIRST``"这个字符串么? dll文件名 是 BSIPC.DLL 跪求大神帮帮忙 告诉我下我该怎么写,没做过引入外部dll....
关于C++的引用与函数调用问题
#关于C++的引用与函数调用问题 之前已经定义了一个函数例如求两点之间的长度 distacne(point &a,point &b); point是点类,函数形参为类的引用。 如果有point c,d可以直接distance(c,d)调用函数。 但是,定义一个返回值为point的函数c(),d()进行如下操作 distance(c(),d()),程序会出错 若返回值为point &则会成功,这是为什么??
c语言调用动态库中的函数,不能获取返回值,但C#可以,不知c代码该如何改进?vs2017环境下。
c语言: typedef char * (__stdcall *MYPROC)(char * s, char * rs);//函数原型,s:传入数据,rs:返回数据。 HINSTANCE hinstLib; MYPROC send; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; WCHAR msg[] = L"{\"head\":{\"jylsh\":\"330199103576000000000000001811\",\"xxlxm\":\"C009\",\"fhsj\":\"\",\"xxfhm\":\"\",\"fhxx\":\"\",\"yytcq\":\"330799\",\"zdjbh\":\"Test11111\",\"yljgdm\":\"8095\",\"czydm\":\"\",\"bbh\":\"1.0\"},\"data\":{\"ksjgs\":{\"klb\":\"12\",\"knsj\":\"A30533169330799D1560000050009A4378127B360\"}}}"; wprintf(L"%s", msg); WCHAR P[] = L""; char oututfmsg[1024] = { 0 }; WCHAR outmsg[2048] = { 0 }; char utfmsg[10240] = { 0 }; unicode_to_utf8((short *)msg, utfmsg); hinstLib = LoadLibrary(TEXT("SendRcvB.dll")); if (hinstLib != NULL) { printf("begin GetProcAddres\n"); send = (MYPROC)GetProcAddress(hinstLib, "SendRcv"); if (NULL != send) { char * rcode = send(utfmsg, oututfmsg);//调试发现oututfmsg调用前后未发生变化 fRunTimeLinkSuccess = TRUE; } wprintf(L"%s", oututfmsg); fFreeResult = FreeLibrary(hinstLib); } c#代码如下: [DllImport("SendRcvB.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.StdCall)] private extern static IntPtr SendRcv(IntPtr sSend, out IntPtr sRcv); public Main() { InitializeComponent(); } private void btn_fs_Click(object sender, EventArgs e) { try { string sRcv, sRs; string sIn = rTextIn.Text; byte[] tmpIn = gbkToUft8(sIn); IntPtr pIn = mallocIntptr(tmpIn.Length); Marshal.Copy(tmpIn, 0, pIn, tmpIn.Length); //IntPtr pIn = mallocIntptr(sIn); IntPtr pOut = IntPtr.Zero; IntPtr pRs = IntPtr.Zero; pRs = SendRcv(pIn, out pOut);//pOut指针在变化,能指向返回数据 sRcv = Marshal.PtrToStringUni(pOut); sRs = Marshal.PtrToStringAnsi(pRs); sRcv = utf8ToGbk(sRcv); rTextOut.Text = sRcv; Marshal.FreeHGlobal(pIn); } catch (Exception oe) { MessageBox.Show(oe.Message); }
VS2008 C# winform 64位程序动态调用VC++ 64位DLL LoadLibrary成功 但是GetProcAddress返回值为0
如果通过 Vs MFC 中调用这个64DLL 用同样的方式动态调用获取函数地址成功,就不知道C#里面为什么返回0。通过Marshal返回值为126. 64DLL是 通过VC6.0建立的程序然后用vs2010自动转换的然后编译生成的64位的DLL.2008建的也不行
C# 使用 Widgets must be created in the GUI thread
在使用C#调用qt的dll时,第一次调用的一般没事,第二,三次就会出现Widgets must be created in the GUI thread。 这是我用的qt中的代码 BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReserved*/ ) { static bool ownApplication = FALSE; if ( dwReason == DLL_PROCESS_ATTACH ) { ownApplication = QMfcApp::pluginInstance( hInstance ); } if ( dwReason == DLL_PROCESS_DETACH && ownApplication ) { delete qApp; } return TRUE; } 这是C#中调用qt的代码 myfun1 = new DLDApi(); myfun1.LoadDll(@"D:\MvcAAA\MvcAAA\bin\meshlab.dll"); // 加载 "Count.dll" myfun1.LoadFun("Test"); // 调入函数 count, "_count@4" 是它的入口,可通过 Depends 查看 object[] Parameters = new object[] { (int)5}; // 实参为 0 Type[] ParameterTypes = new Type[] { typeof(int) }; // 实参类型为 int DLDApi.ModePass[] themode = new DLDApi.ModePass[] { DLDApi.ModePass.ByValue }; // 传送方式为值传 Type Type_Return = typeof(int); // 返回类型为 int // 弹出提示框,显示调用 myfun.Invoke 方法的结果,即调用 count 函数 int i = (int)myfun1.Invoke(Parameters, ParameterTypes, themode, Type_Return); myfun1.UnLoadDll(); C#代码在运行**UnLoadDll**卸载dll方法后,DLL_PROCESS_DETACH中断delete app并没有被执行,整个dll里面有一个qt的线程,卸载了dll后线程并没有被关闭,导致第二次运行的时候无法再次创建QWidegt对象。 想要请教以下各位,如何让在调用完dll后让中的线程关闭掉。是应该写在C++的这个dll中还是写在C#的调用中, 同时这个qt的dll中有一个对象My3Doperation,这个对象继承与QWidget,如何在使用完这个对象后将创建的线程彻底删除。 extern "C" __declspec(dllexport) int Test(int fileName) { My3Doperation model; //计算代码 return fileName+5; }
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
C语言荣获2019年度最佳编程语言
关注、星标公众号,不错过精彩内容作者:黄工公众号:strongerHuang近日,TIOBE官方发布了2020年1月编程语言排行榜单。我在前面给过一篇文章《2019年11月C语言接近Ja...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
一份王者荣耀的英雄数据报告
咪哥杂谈本篇阅读时间约为 6 分钟。1前言前一阵写了关于王者的一些系列文章,从数据的获取到数据清洗,数据落地,都是为了本篇的铺垫。今天来实现一下,看看不同维度得到的结论。2环境准备本次实...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
立即提问