C#DLL如何调用C#主程序的回调函数?

网上大多都是,C#委托实现C++ Dll中的回调函数。有没有C#DLL如何调用C#主程序的回调函数?

c#

2个回答

既然都是C#,就直接用委托好了。

dll里
public class A
{
public void calltwice(Action act)
{
act();
act();
}
}
主程序
public class Program
{
static void MyFunc()
{
Console.WriteLine("hello world!");
}
static void Main()
{
A a = new A();
a.calltwice(MyFunc);
}
}

委托
void Main()
{
Action a = new Action(() => Console.WriteLine("hello world!"));
CallMe3Times(a);
}

void CallMe3Times(Action a)
{
a();
a();
a();
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++调用c#的dll时回调函数该如何处理
比如该c#的dll中,服务器连接的函数会回调一个A方法。那么我在c++中只需要实现这个A方法,还是需要把整个回调逻辑再实现一遍。。。。
C# 调用C 的dll参数为回调函数
C# 调用C 的dll参数为回调函数 C 代码: ``` typedef void (*LP_GET)(unsigned char *buf) ; typedef unsigned char (*LP_UARTA_INIT)(unsigned char no, int baudrate, LP_GET GetFun) ; ``` C# 代码: ``` public delegate void LP_GET(byte[] buf); public static extern char UARTA_Init(char no, int baudrate, LP_GET getFun); LP_GET lpGet = new LP_GET(LP_GET_GetFun); UARTA_Init('1', 2, lpGet); ``` 在C#我用委托,但是会报错,信息:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。我觉得是不是参数类型不对啊。
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++的dll文件时,存在调用继承了另一个类的回到函数如何调用?
![图片说明](https://img-ask.csdn.net/upload/201911/27/1574817535_261789.png) 在调用此回调函数时,写了委托但是没有调用成功 下面是委托代码 ``` [UnmanagedFunctionPointerAttribute(CallingConvention.StdCall, CharSet = CharSet.Ansi)] public delegate void CCallbackImp(int nEventID, structure.CR_Event pEvent); ``` 下面是调用dll注册回到函数代码 ``` [DllImport(@"CRInterface.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "CR_RegisterEventCallback")] public extern unsafe static int CR_RegisterEventCallback(CCallbackImp pCallback); ``` 回调函数具体代码 ``` public static void CallBackFunction(int nEventID, structure.CR_Event pEvent) { MessageBox.Show("进入回调函数"+nEventID.ToString()); if (nEventID == (int)structure.CR_EventID.CR_EVT_NEW_FRAME) { MessageBox.Show(nEventID.ToString()); } } ``` 接口原理是当执行以下代码是,dll会自动调用回调函数,然后执行会到函数中的代码 ``` resultprop = ImportDll.CR_StartAcquisition(cDETR_IDX, cFRM_NUM,(IntPtr) nBufSize, 1); ``` 但是最后不知道哪儿错误了,么有进入回调函数中
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#调用c++写的dll,当dll(dll怎样跟硬件通讯的不管)读取到卡片信息时,通过回调函数把卡片信息传递到C#这边来 ``` c# 这边调用此方法设置回调函数: [DllImport("TCP102_SDK.dll", EntryPoint = "?TCP102_InitCallBack@@YGEKPAU_CALLBACK_FUN@@@Z")] public unsafe static extern byte TCP105_InitCallBack(uint dwUser, ref CALLBACK_FUN p_call_back);troller@@YGEPADEE@Z")] 回调函数: //STRUCT [StructLayout(LayoutKind.Sequential)] public struct CARD_NUMBER_MSG { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] ControllerIP; public uint CommandSeq; public uint ReaderID; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] CardID; public string print() { return "CARD_NUMBER_MSG information : ControllerIP:" + String.Format("{0}.{1}.{2}.{3}", ControllerIP[0], ControllerIP[1], ControllerIP[2], ControllerIP[3]) + " CommandSeq:" + CommandSeq + " ReaderID: " + ReaderID + " CardID " + String.Format("{0}|长度:{1}", CardID[0], CardID.Length); } } public delegate void ReadedCardNumber(uint dwUser, ref CARD_NUMBER_M SG p_card_msg); [StructLayout(LayoutKind.Sequential)] public struct CALLBACK_FUN { public ReadedCardNumber p_ReadedCardNumberCallBack; } ``` ``` c++里面的设置回调函数的代码: /****************************************************************************************************** * Function Name : TCP102SetReceivedDataCallBack * Description : 设置回调 * Arguments : None. * Output : None. * Return : None. * Note(s) : None. *******************************************************************************************************/ TCP102_SDK_API unsigned char __stdcall TCP102_InitCallBack(DWORD dwUser,CALLBACK_FUN *p_call_back) { if((NULL==p_call_back)||(0==dwUser)) { return TCP102_ERR_PARAMETER; } //设置回调函数指针 ReadedCardNumberCallBack = p_call_back->p_ReadedCardNumberCallBack; h_CallBackWindow = dwUser; return TCP102_ERR_OK; } ``` 要实现的功能就是正确的初始化、设置回调函数...后,当sdk有读到卡片数据后,将读到的数据通过回调函数传递到c#这边来。 现在的问题是,第一次触发dll把读到的卡片信息回调到c#这边可以正确执行。但第二次就报未实例化对象的错误了。想知道有大神遇到过这样的问题吗?求解答。(目前调试的结果是还没触发回调方法就报未实例化对象的错了,在想是不是没找到回调方法的指针地址.)
c++的函数转到C#里用调用,这个参数不知道怎么转换
MMC_INT16U pmc4bpci_open(int id, void (WINAPI *funcIntHandler)(void)); void (WINAPI *funcIntHandler)(void) 这个在C#应该怎么定义?是回调函数? 应该怎么声明?
Delphi 调用C++ dll 回调函数
用Delphi 调用容联云通信的动态库CCPAppClient.DLL,其中有一个函数 Function CCPinit( CallbackInterface: CCPCALLBACKINTERFACE ):Integer;stdcall; 参数CCPCALLBACKINTERFACE 是一个结构体指针,包含 onConnected , onConnectError 等回调函数。 在调用函数CCPinit调用成功后(返回值0),会触发CCPCALLBACKINTERFACE 结构体中的回调函数onConnected 这部分代码用Delphi如何写?麻烦高手给看一下 下面是C#的demo CCPCall.instance.loginInterface = this; string ret = CCPCall.instance.LoginCCP(); if (ret != null) { MessageBox.Show(ret, "登录失败", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); } else { login_btn.Enabled = false; login_btn.BackgroundImage = Resources.bluebutton_disable; login_btn.ForeColor = Color.White; login_btn.Text = "登录中...请稍后"; } public delegate void LoginDelegate(); #region ILoginInterface 成员 public void onConnected() { LoginDelegate connected = delegate() { IMDBAccess.CreateIMMessageTable(); IMDBAccess.CreateGroupNoticeTabel(); this.Hide(); new MainForm().Show(); }; this.BeginInvoke(connected); } public void onConnectError(CloopenReason reason) { LoginDelegate error = delegate() { login_btn.Enabled = true; login_btn.BackgroundImage = Resources.bluebutton_normal; login_btn.Text = "登录"; }; login_btn.BeginInvoke(error); } #endregion ```
C#调用C++的dll,C++程序中给结构体中变量赋值this指针,对应C#中应该怎么写呢?
C++程序中有一个结构体 ``` struct Ctx { void* owner; DevInfo devinfo; }; ``` 对话框类头文件中有 ``` Ctx m_ctx;//回调上下文, 作为回调函数的参数 ``` 在对话框初始化程序中有 ``` m_ctx.owner = this; ``` 我在C#中定义结构体 ``` public struct Ctx { public IntPtr powner; public DevInfo devinfo; } ``` 定义了 public Ctx m_ctx; 那么怎么给m_ctx.powner赋值呢? 下面是部分代码,需要的话也可以把代码都发出来 C++ ``` BOOL Cdbc_demoDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 m_hDBC = DBC_Init(); if (INVALID_DBC_HANDLE == m_hDBC) { MessageBox(_T("生成DBC句柄失败!")); return TRUE; } m_ctx.owner = this; m_ctx.devinfo = m_devInfo; DBC_SetSender(m_hDBC, OnSendFunc, &m_ctx); DBC_SetOnMultiTransDoneFunc(m_hDBC, OnMultiTransDoneFunc, &m_ctx); InitList(); if (!InitDevice()) { MessageBox(_T("打开设备失败!")); return TRUE; } return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } ```
C#WinForm多线程更新treeview问题
C#新手。。。C#程序调用dll,dll中有一个回调函数用于接受数据,想根据接收到的数据增加treeview节点,怎么操作?直接在回调函数中程序会崩溃。 nt iSize = cJSON_GetArraySize(iptr11); for (int i = 0; i < iSize; i++) { IntPtr iptr12 = cJSON_GetArrayItem(iptr11, i); if (iptr12 != IntPtr.Zero) { IntPtr iptr13 = cJSON_GetObjectItem(iptr12, "deviceId");//这个“DeviceName”名称待定 if (iptr13 != IntPtr.Zero) { Json entries = (Json)Marshal.PtrToStructure(iptr13, typeof(Json)); string str = entries.valuestring; this.treeView1.Nodes.Add(str); } } }
C#写一款ip摄像头上位机,用RealPlayWnd.Handle;为啥是无效的句柄
我在用C#做某款小众摄像头的二次开发,写成功过海康产品的上位机,但是这款一直遇到一个问题困扰着我! 给的Demo用的是C++语言,我选择C#开发,在成功调用了初始化函数和登录设备函数后(说明给的dll是对的),调用打开通道Client_OpenChannel(OPEN_INFO *pOpenInfo)函数却一直无法实现。 我是这样写的: ![图片说明](https://img-ask.csdn.net/upload/201602/25/1456395796_291514.png) 一直返回无效句柄的意思。 厂家给的Demo里是这样写的: ![图片说明](https://img-ask.csdn.net/upload/201602/25/1456395886_293092.png) 这个结构的定义 [StructLayoutAttribute(LayoutKind.Sequential)] public struct tagIPNC_OPEN_INFO { public IntPtr hPlayWnd; public emVideoRes ImageSize; public emVideoCodecType CodecType; public emAVStreamType StreamType;//主码流和次码流分辨率相同时,一般录像时使用主码流,预览时采用次码流 public emAVStreamProtocol Protocol; public bool bOpenDisplay;//是否打开预览 public bool bScale;//是否按比例显示画面 public bool bPlayAudio;//是否播放音频 public bool bRecvAvData;//是否回调未解码数据 public bool bRecvDecodedAvData;//是否回调解码数据,未打开预览时,不能回调解码数据 } //打开通道函数的定义 [DllImport("IPNCSDK.dll", EntryPoint = "Client_OpenChannel", CallingConvention = CallingConvention.Cdecl)] public static extern emReturnValue Client_OpenChannel(ref tagIPNC_OPEN_INFO pOpenInfo); 我想问: 1.这个返回的emReturninvalidateHwnd,基本上我确定了是说我赋的窗口控件的句柄不对 info.hPlayWnd = RealPlayWnd.Handle;可我以前的都是这么赋的,不知道为啥不对 2.相关C++到C#的转换我也做了很多回了,基本格式相关转换应该也没问题 3.这是一个小厂商的产品,但某一方面性能很好必须选用,他们之前也没用C#开发过,难道是他们的DLL的问题?隐隐有一种不安,我在执行状态下会出现这种 ![图片说明](https://img-ask.csdn.net/upload/201602/25/1456395916_576985.png) SDK core dumped 这个core dumped是什么意思呢? 联系过厂家他们不管C#的事,这个问题困扰了我半个多月一直找不到端倪,求助大家,感激不尽!!!!
求助 wpf能不能使用回调函数?
流程是这样的 电脑通过dll档案和控制器通信,连接成功后控制器通过一个回调函数返回控制器版本信息,在这个回调函数里进行listview.items.add把版本信息添加到listview 这种方法可行吗?为什么我在winform上可以用在wpf时用不了呢?断点看到了返回了数据的,刚刚接触,还请帮忙,多谢了!![图片](https://img-ask.csdn.net/upload/201709/18/1505736345_239820.jpg)
全局键盘钩子函数的回调函数有时无效
``` DLL代码: myHooke.c #include "myHooke.h" #include <windows.h> #include <winuser.h> #include <stdlib.h> #include <stdio.h> int ndown = 0; HHOOK hhkHook = NULL; //定义钩子句柄 HINSTANCE hInstance = NULL; //程序实例 BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } hInstance = (HINSTANCE)hModule; //得到DLL实例 return TRUE; } //回调函数 __declspec(dllexport) LRESULT CALLBACK myHookProc(int nCode, WPARAM wParam, LPARAM lParam) { LRESULT Result=CallNextHookEx(hhkHook, nCode, wParam, lParam); if(wParam == 'M' && (lParam & 0x40000000)) { printf("M is downed ! %d\n", ndown++); } return Result; } //加载钩子 int load() { if(!(hhkHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)myHookProc, hInstance, 0))) { return FALSE; } return TRUE; } //卸载钩子 int unload() { return UnhookWindowsHookEx(hhkHook); } myHooke.h: #ifndef MYHOOKD_H #define MYHOOKD_H #define EXPORT __declspec(dllexport) #define _WIN32_WINNT 0x400 EXPORT int load(); EXPORT int unload(); #endif 调用的函数: #include <windows.h> #include <winuser.h> #include <stdio.h> #include <stdlib.h> typedef int (*FUNCTION)(); int main(int argc, char *argv[]) { HINSTANCE hDll; FUNCTION loadhook = NULL; FUNCTION unloadhook = NULL; hDll = LoadLibrary("..\\myHooke\\Debug\\myHooke.dll"); if(hDll != NULL) { loadhook = (FUNCTION)GetProcAddress(hDll, "load"); unloadhook = (FUNCTION)GetProcAddress(hDll, "unload"); if(loadhook == NULL) { MessageBox(0, "loadhook failed", "MyHook", MB_OK); return 1; } if(unloadhook == NULL) { MessageBox(0, "unloadhook failed", "MyHook", MB_OK); return 1; } if(!loadhook()) { return 1; } // while(1) { printf("hook is load !"); MessageBox(0, "Hold on box", "MyHook", MB_OK); //使用循环会使程序卡住,所以用了MessageBox是程序暂停 Sleep(1000); } unloadhook(); FreeLibrary(hDll); } return 0; } ``` 有些出口可以获取键盘消息,有些不能获取键盘消息,这是全局钩子,我是菜鸟,求大神帮助啊!!! 补充一下,程序运行时,切换到其他程序,有的可以获取键盘消息,printf有响应;有的没有任何响应,比如切换到网页等; 我想实现的功能是:无论在哪里,只要键盘按下,我的程序就会有响应 打印按键被按下的消息
C++中回调函数的实现以及代码错误
我是一个刚学C++的小白,基础比较差,但是现在有一个东西必须学习,就是回调函数。其实不太懂回调函数原理,我现在要写一个类之后封装成dll文件。最后写一个MFC程序调用这个dll文件。 内容就是需要写一个相机采集的简单步骤,需要MFC程序用回调函数的方式几首图像。接受图像就写成简单的文字就可以了。以下是我的代码: 类.h文件 #ifdef MYCAMDLL_EXPORTS #define MYCAMDLL_API __declspec(dllexport) #else #define MYCAMDLL_API __declspec(dllimport) #endif // //#ifndef MYCAMDLL_API //#define MYCAMDLL_API __declspec(dllimport) //#endif typedef void(CMyCamDll::*CallBackPtr)(void *, char *); // 此类是从 MyCamDll.dll 导出的 /* EXTERN_C */ class MYCAMDLL_API CMyCamDll { public: CMyCamDll(void); // TODO: 在此添加您的方法。 public: void OpenDiv(); void Start(); void Display(); void Stop(); void CloseDiv(); void call(); void setcallback(); private: CallBackPtr *callback; CMyCamDll *per; }; 类.cpp文件: #include "stdafx.h" #include "MyCamDll.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CWinApp theApp; using namespace std; CMyCamDll::CMyCamDll() { } void CMyCamDll::call() { MessageBox(NULL, "图像显示", "显示图像中", NULL); } void CMyCamDll::setcallback() { callback = (CallBackPtr)(&CMyCamDll::call); per = this; } void CMyCamDll::OpenDiv() { MessageBox(NULL, "开启设备", "设备已启用", NULL); } void CMyCamDll::Start() { MessageBox(NULL, "采集图像", "已开始采集", NULL); } void CMyCamDll::Display() { MessageBox(NULL, "显示图像", "图像已显示", NULL); } void CMyCamDll::Stop() { MessageBox(NULL, "停止采集", "已停止采集", NULL); } void CMyCamDll::CloseDiv() { MessageBox(NULL, "关闭设备", "设备已关闭", NULL); (CallBackPtr)这里出现报错:IntelliSense: 不允许强制转换到类型 "CallBackPtr"
(图像采集)C++转C#如何实现
我在使用第三方的图像采集代码库(C++编码),想转成C#,结果不知如何实现? 我尽可能提供更加详细的信息,期待大神能够帮忙解决。 1)第三方提供的图像采集头文件:-------------------------------------- #ifndef __ATCAM_H__ #define __ATCAM_H__ #ifdef ATCAM_EXPORTS #define ATCAM_API __declspec(dllexport) #else #define ATCAM_API __declspec(dllimport) #endif //Parameters Defines #define PARA_CAM_INT 0x5001 #define PARA_CAM_GAIN 0x5002 //Acquire Information typedef struct _AtInfo { int CodeAcq; //Code Acquire void * pData; //Data Pointer void * Context; //Context For User Application }AtInfo,*PAtInfo; //CallBack Function typedef void (__stdcall *AtCallBack)(AtInfo * pInfo); #ifdef __cplusplus extern "C" { #endif //Get Device Count ATCAM_API int __stdcall AtCamDev( int * count ); //Open the Selected Device ATCAM_API int __stdcall AtCamOpen( int devNo ); //Close the Selected Device ATCAM_API int __stdcall AtCamClose( int devNo ); //Get Device Parameters ATCAM_API int __stdcall AtCamGet( int devNo, int para, void * buf ); //Set Device Parameters ATCAM_API int __stdcall AtCamSet( int devNo, int para, int * buf ); //Start Acquire ATCAM_API int __stdcall AtCamStart( int devNo, PAtInfo pInfo, AtCallBack callBack ); //Stop Acquire ATCAM_API int __stdcall AtCamStop( int devNo ); #ifdef __cplusplus } #endif #endif 2)C++中图像采集实现:---------------------------------------------- 头文件中的定义: AtInfo m_sInfo; static void __stdcall AcqCallBack(PAtInfo pInfo); 在*.cpp文件中 AtCamStart(0,&m_sInfo,AcqCallBack); //采集回调函数 void CAtCamDemoDlg::AcqCallBack(PAtInfo pInfo) { //获取上下文信息,发送更新消息 CAtCamDemoDlg * pDlg = (CAtCamDemoDlg*)pInfo->Context; ::PostMessageW( pDlg->m_hWnd,WM_ACQUIRED,(WPARAM)pInfo,pInfo->CodeAcq ); } /采集更新消息函数 LONG CAtCamDemoDlg::OnAcquired(WPARAM wParam, LPARAM lParam) { //未启动采集,返回 if( false == m_bAcquiring ) return 0; //采集结果判断 int rc = (int)lParam; if( 0!=rc ) { OnBnClickedBtnRun(); MessageBox(_T("采集失败!"),_T("错误"),MB_OK); } else { //成功采集,拷贝数据,更新显示 memcpy(m_pDataBuf, m_sInfo.pData, IMAGES); if( false == m_ctrlImage.m_bUpdating ) m_ctrlImage.UpdateImage(m_pDataBuf); } return 0; } 3)我在C#中的定义:---------------------------------------------------- public struct AtInfo { public int CodeAcq; public IntPtr pData; public IntPtr Context; }; //grab start [DllImport("AtCam.dll", EntryPoint = "AtCamStart")] public static extern int AtCamStart(int devNo, out AtInfo pInfo, AtCallback callback); 4)我的实现:---------------------------------------------------------- 开始采集 private void Btn_GrabStart_Click(object sender, EventArgs e) { if (!camOpened) return; if (inAcquiring) return; int ret = 0; ret=OptiMat.AtCamStart(0, out sInfo, AcqCallback); textBox1.Text += Environment.NewLine + "Capture Start return: " + ret.ToString(); inAcquiring = true; } 回调: private void AcqCallback(out AtInfo info) { AtInfo info0 = new AtInfo(); info=info0; OptiMatImage.PostMessage(hShowMsgWin, OptiMatImage.IMG_MESSAGE, info.CodeAcq, info); } 消息处理: protected override void DefWndProc(ref Message m) { switch (m.Msg) { //接收自定义消息MYMESSAGE,并显示其参数 case OptiMatImage.IMG_MESSAGE: AtInfo ml = new AtInfo(); ml.pData = m.LParam; ml.CodeAcq = (m.WParam).ToInt32(); ShowImage(ml); break; default: base.DefWndProc(ref m); break; } } 图像显示: private void ShowImage(AtInfo ip) { Marshal.Copy(ip.pData, dataBuf, 0, OptiMat.IMAGES); } 在这一步会出现以下错误: ![图片说明](https://img-ask.csdn.net/upload/201809/14/1536913950_239629.png) 请指出------------------------------------------------------------------ 1)哪里出现错误了; 2)我不熟悉这种转换,如何改进比较好?
c++ WH_GETMESSAGE 钩子 ,勾住程序,但是回调函数没执行,请教
需要拦截目标程序的显示和关闭窗口消息。照搬网上的代码。显示注入DLL成功。但是回调函数并没有执行。请教 ``` #include "stdafx.h" #include <stdio.h> #include <stdlib.h> HHOOK hooker; HWND notepadhandle; BOOL handled; extern "C" __declspec(dllexport) LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam); char* ConvertInttoChar(int i); BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { if(ul_reason_for_call==DLL_PROCESS_ATTACH) { handled=FALSE; notepadhandle=FindWindow(TEXT("Notepad"),NULL); if(notepadhandle==NULL) { printf("Notepad Not Found.\n"); return TRUE; } hooker=SetWindowsHookEx(WH_GETMESSAGE,HookProc,(HINSTANCE)hModule,GetWindowThreadProcessId(notepadhandle,NULL)); if(hooker) { OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,(DWORD)notepadhandle); printf("hookpro:%d\n",HookProc); printf("hmodule:%d\n",hModule); printf("pid:%d\n",notepadhandle); printf("Hook Successfully.\nHookID:%d\n",hooker); } else { printf("Hook Failed.\nError:%d\n",GetLastError()); return TRUE; } //PostMessage(notepadhandle,WM_CLOSE,0,0); //printf("发送关闭指令"); } if(ul_reason_for_call==DLL_PROCESS_DETACH) { UnhookWindowsHookEx(hooker); return TRUE; } return TRUE; } extern "C" __declspec(dllexport) LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam) { printf("NCOD111"); if(nCode<0) { printf("NCOD<0"); return CallNextHookEx(hooker,nCode,wParam,lParam); } tagMSG* msg; msg=(tagMSG*)lParam; if(nCode==HC_ACTION && (msg->message==WM_CLOSE)) { if(handled==FALSE) printf("拦截到消息:%d\n",msg->message); handled=TRUE; UnhookWindowsHookEx(hooker); msg->message=WM_NULL; return CallNextHookEx(hooker,nCode,wParam,(LPARAM)msg); } printf("LAST"); return CallNextHookEx(hooker,nCode,wParam,lParam); } ``` 执行的结果,DLLmain的代码能正常执行,并显示注入成功;但是回调函数中的打印代码均没执行,请教。 执行结果 hookpro:1666846815 hmodule:1666777088 pid:4063406 Hook Successfully. HookID:17567643
海康sdk 回调函数取帧,是否存在丢包
现象描述: 海康sdk 回调函数取帧,作检测人脸,是不是会出现一张断层的人脸照。 如下图: ![图片说明](https://img-ask.csdn.net/upload/201908/01/1564637958_400591.jpg) 可能原因是什么? 调用函数为:NET_DVR_SetRealDataCallBack() BOOL NET_DVR_SetRealDataCallBack( LONG lRealHandle, fRealDataCallBack cbRealDataCallBack, DWORD dwUser ); 官方文档中提到这样几句话: 1、cbRealDataCallBack回调函数中不能执行可能会占用时间较长的接口或操作,不建议调用该SDK(HCNetSDK.dll)本身的接口。 2、此函数包括开始和停止用户处理SDK捕获的数据,当回调函数cbRealDataCallBack设为非NULL值时,表示回调和处理数据;当设为NULL时表示停止回调和处理数据。回调的第一个包是40个字节的文件头,供后续解码使用,之后回调的是压缩的码流。回调数据最大为256K字节。 官方也给出是实例代码: ``` #include <stdio.h> #include <iostream> #include <time.h> #include "plaympeg4.h" using namespace std; LONG lPort; //全局的播放库port号 void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,DWORD dwUser) { HWND hWnd = GetConsoleWindow(); switch (dwDataType) { case NET_DVR_SYSHEAD: //系统头 if (!PlayM4_GetPort(&lPort)) //获取播放库未使用的通道号 { break; } //m_iPort = lPort; //第一次回调的是系统头,将获取的播放库port号赋值给全局port,下次回调数据时即使用此port号播放 if (dwBufSize > 0) { if (!PlayM4_SetStreamOpenMode(lPort, STREAME_REALTIME)) //设置实时流播放模式 { break; } if (!PlayM4_OpenStream(lPort, pBuffer, dwBufSize, 1024*1024)) //打开流接口 { break; } if (!PlayM4_Play(lPort, hWnd)) //播放开始 { break; } } case NET_DVR_STREAMDATA: //码流数据 if (dwBufSize > 0 && lPort != -1) { if (!PlayM4_InputData(lPort, pBuffer, dwBufSize)) { break; } } } } void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser) { char tempbuf[256] = {0}; switch(dwType) { case EXCEPTION_RECONNECT: //预览时重连 printf("----------reconnect--------%d\n", time(NULL)); break; default: break; } } void main() { //--------------------------------------- // 初始化 NET_DVR_Init(); //--------------------------------------- // 注册设备 LONG lUserID; NET_DVR_DEVICEINFO_V30 struDeviceInfo; lUserID = NET_DVR_Login_V30("172.0.0.100", 8000, "admin", "12345", &struDeviceInfo); if (lUserID < 0) { printf("Login error, %d\n", NET_DVR_GetLastError()); NET_DVR_Cleanup(); return; } //--------------------------------------- //设置异常消息回调函数 NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL); //--------------------------------------- //启动预览并设置回调数据流 LONG lRealPlayHandle; NET_DVR_CLIENTINFO ClientInfo = {0}; ClientInfo.hPlayWnd = NULL; //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空 ClientInfo.lChannel = 1; //预览通道号 ClientInfo.lLinkMode = 0; //最高位(31)为0表示主码流,为1表示子码流0~30位表示连接方式:0-TCP方式;1-UDP方式;2-多播方式;3-RTP方式; ClientInfo.sMultiCastIP = NULL; //多播地址,需要多播预览时配置 BOOL bPreviewBlock = false; //请求码流过程是否阻塞,0:否,1:是 lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, NULL, NULL, 0); if (lRealPlayHandle < 0) { printf("NET_DVR_RealPlay_V30 error\n"); NET_DVR_Logout(lUserID); NET_DVR_Cleanup(); return; } if (!NET_DVR_SetRealDataCallBack(lRealPlayHandle, g_RealDataCallBack_V30, 0)) { printf("NET_DVR_SetRealDataCallBack error\n"); } //--------------------------------------- //关闭预览 NET_DVR_StopRealPlay(lRealPlayHandle); //注销用户 NET_DVR_Logout_V30(lUserID); NET_DVR_Cleanup(); return; } ```
C语言中,对一段函数进行超时判断,请问怎么实现?
windows下的C语言编程,需要对一段第三方dll中的函数进行超时控制,参考了很多种技术都没实现,请问该如何解决。 先说说我想到的东西: 1.<unistd.h>中的alarm,这玩意儿在Linux下有效,在Windows中无法使用,即使我用的MinGW标准gcc编译器。 2.<windows.h>中的timeSetEvent,配合<setjmp.h>中的setjmp和longjmp,这个是最接近的,可惜运行到超时时中断是中断了,可是一直会弹窗报错,不知道为什么。 我在下面的评论中把第二个思路的代码贴出来,再截一个弹窗报警的图。 请教C语言和Win32API高手帮忙看看。 ``` 作者:丁丁 链接:https://www.zhihu.com/question/49052307/answer/113997254 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <setjmp.h> jmp_buf j; /** * 时间中断函数 */ void PASCAL OneMilliSecondProc(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dwl, DWORD dw2) { printf("Timout!\n"); longjmp(j,1); } int longTimeFunction(){ while (1) { printf("operating...\n"); Sleep(1000); } return 0; } int main(){ HANDLE hHandle; UINT wTimerRes_1ms;//定义时间间隔 UINT wAccuracy; //定义分辨率 UINT TimerID_1ms; //定义定时器句柄 wTimerRes_1ms = 5000; if((TimerID_1ms = timeSetEvent( wTimerRes_1ms, wAccuracy, (LPTIMECALLBACK)OneMilliSecondProc, // 回调函数 (DWORD)(1), // 用户传送到回调函数的数据; TIME_PERIODIC//周期调用定时处理函数 )) == 0) { printf("start!!!!!!!!!!!\n"); } else { printf("end!!!!!!!!!!!\n"); } int temp = 0; if(setjmp(j) == 0){ temp = longTimeFunction(); }else{ printf("xxxxxx...\n"); temp = -1; } printf("%d\n", temp); return 0; } ``` ![图片说明](https://img-ask.csdn.net/upload/201607/30/1469849217_947073.png)
vb.net Invoke”类型的已垃圾回收委托进行了回调。
**一个签名版的二次开发,遇到下面问题** WindowsApplication1.Module1+SubClassProcDelegate::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 ``` Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Module1.SubclassWindow(Me.Handle) End Sub ``` Module Module1 Public Const HD_OK As Integer = 31111 Public Const HD_CANCEL As Integer = 31112 Public Const HD_REALTIMEDATA As Integer = 31113 Public inkingWindowWidth As Integer Public inkingWindowHeight As Integer Private Const GWL_WNDPROC = (-4) Private procOld As Integer Private Declare Function CallWindowProc Lib "USER32.DLL" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Integer, ByVal hWnd As Integer, ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As SubClassProcDelegate) As Integer '重载API函数,最后一个参数为委托类型,注意Long类型参数变成了Integer. Delegate Function SubClassProcDelegate(ByVal hwnd As Integer, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer '定义窗口过程的委托类型 Public Sub SubclassWindow(ByVal hWnd As Integer) procOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf SubWndProc) End Sub Public Function SubWndProc(ByVal hWnd As Integer, ByVal iMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer If hWnd = Form1.Handle.ToInt32 Then Dim X, Y, Pressure, IsPenDown As Integer X = wParam And 65535 Y = (wParam / 65536) And 65535 X = (X / 65535 * inkingWindowWidth) And 65535 Y = (Y / 65535 * inkingWindowHeight) And 65535 Pressure = lParam And 65535 IsPenDown = (lParam / 65536) And 65535 SubWndProc = True Exit Function End If SubWndProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam) End Function End Module
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch
深深的码丨Java HashMap 透析
HashMap 相关概念 HashTab、HashMap、TreeMap 均以键值对像是存储或操作数据元素。HashTab继承自Dictionary,HashMap、TreeMap继承自AbstractMap,三者均实现Map接口 **HashTab:**同步哈希表,不支持null键或值,因为同步导致性能影响,很少被使用 **HashMap:**应用较多的非同步哈希表,支持null键或值,是键值对...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
相关热词 c#处理浮点数 c# 生成字母数字随机数 c# 动态曲线 控件 c# oracle 开发 c#选择字体大小的控件 c# usb 批量传输 c#10进制转8进制 c#转base64 c# 科学计算 c#下拉列表获取串口
立即提问