Articles of c + +

通过dll边界传递对STL向量的引用

我有一个很好的库来pipe理需要返回特定的string列表的文件。 由于我将要使用的唯一代码将是C ++(和Java,但通过JNI使用C ++),我决定使用标准库中的向量。 库函数看起来有点像这样(其中FILE_MANAGER_EXPORT是平台定义的导出要求): extern "C" FILE_MANAGER_EXPORT void get_all_files(vector<string> &files) { files.clear(); for (vector<file_struct>::iterator i = file_structs.begin(); i != file_structs.end(); ++i) { files.push_back(i->full_path); } } 我使用vector作为引用而不是返回值的原因是为了保持内存分配的健全,并且因为windows对于c ++返回types有一个extern“C”真是不高兴(谁知道为什么,我的理解是所有的extern都是“ C“的作用是防止编译器中的名称混乱)。 无论如何,与其他c ++一起使用这个代码一般如下: #if defined _WIN32 #include <Windows.h> #define GET_METHOD GetProcAddress #define OPEN_LIBRARY(X) LoadLibrary((LPCSTR)X) #define LIBRARY_POINTER_TYPE HMODULE #define CLOSE_LIBRARY FreeLibrary #else #include <dlfcn.h> #define GET_METHOD dlsym #define […]

从服务器获取Windowslogin名

我一直在这个问题上坚持了几天 – 任何帮助,非常感谢。 我有一个SQL触发器调用用C#编写的DLL。 在这个函数中,我需要发起启动触发器的SQL命令的人的windowslogin名。 我是否从C#或SQL获取这些信息并不重要。 不幸的是,大多数正常的路线都失败了。 内置SQL函数NT_C​​LIENT()仅在SQLlogin使用Windows身份validation时才有效。 DLL正在服务器上运行,因此Environment.UserName与WindowsIdentity.GetCurrent()。Name无关,除非数据库用户(线程发起者)使用Windows身份validation,否则返回一个空string。 我知道域名,IP地址和工作站名称。 从这里我已经想出了如何获得在C#中的SID – 有无论如何,我可以从这些信息的C#使用C#或有一个SQL内置的函数,我错过了Windowslogin名? 编辑:谢谢你让我知道SQL是这个问题的一个哑巴。 我们所拥有的是一个将每个人作为一个用户login到数据库的客户端。 我最终不得不做一个不安全的程序集,调用一个命令行函数WMIC。 Yucky解决scheme,但它完成了工作。 再次感谢你提供的build议。 🙂

c编程检查是否按下键不停止程序

如你所知,当在窗口中使用getch()时,应用程序会等待你,直到你按下一个键, 如何在不冻结程序的情况下读取密钥,例如: void main(){ char c; while(1){ printf("hello\n"); if (c=getch()) { . . . } } 谢谢。

按进程隐藏多个窗口

我有一个过程,我想隐藏窗口。 如果这个过程只有一个窗口,它会很好用。 但是,如果有提示对话框或提示对话框或另一个子窗口,隐藏方法只隐藏主窗口,而不是对话框… 你能帮我隐藏一个过程的所有窗口吗? 非常感谢 这是我的代码: [DllImport("user32.dll")] private static extern Boolean ShowWindow(IntPtr hWnd, Int32 nCmdShow); public void Show() { ShowWindow(_processHwnd, SwShow); } public void Hide() { Process[] processRunning = Process.GetProcesses(); foreach (Process pr in processRunning) { if (pr.Id == _process.Id) { _processHwnd = pr.MainWindowHandle; } } ShowWindow(_processHwnd, SwHide); }

最快的时间分辨系统

什么是C / C ++程序员可以使用的最快的计时系统? 例如: time()会给出自1970年1月1日00:00以来的秒数。 Windows上的GetTickCount()会自系统启动时间以毫秒为单位给出时间,但限于49.7天(之后它简单回绕为零)。 我想获取当前时间,或者从系统/应用程序启动时间(以毫秒为单位)开始计时。 最大的担忧是该方法的开销 – 我需要最轻的一个,因为我打算每秒钟多次调用它。 我的情况是,我有一个工作线程,并为该工作线程我张贴待工作。 每个工作都有一个“执行时间”。 所以,我不在乎时间是否是当前的“真实”时间或系统运行时间以来的时间 – 它必须是线性的和轻的。 编辑: unsigned __int64 GetTickCountEx() { static DWORD dwWraps = 0; static DWORD dwLast = 0; DWORD dwCurrent = 0; timeMutex.lock(); dwCurrent = GetTickCount(); if(dwLast > dwCurrent) dwWraps++; dwLast = dwCurrent; unsigned __int64 timeResult = ((unsigned __int64)0xFFFFFFFF * dwWraps) + […]

自动closures一个MessageBox

我有第三方encryption库,如果密钥创build失败,可能会创build一个MessageBox。 这种失败可能是由于随机数字的产生或其他稀疏性造成的,在大多数情况下,再次尝试会导致成功。 我的代码将尝试密钥创build多达三次,然后再决定失败。 现在,问题是该程序可能会与自动化一起使用。 如果在自动化过程中创build了一个MessageBox,它将永远阻止这个进程,因为没有人点击'OK'button。 有没有人知道这种消息框创build时捕捉的方式,并自动closures它? 任何事情都是公平的游戏,只要它不会使安全套件生气。 这意味着没有挂钩或代码隧道。 总之,我需要捕获一个MessageBox被创build并closures它。 MessageBox的创build超出了我的控制范围。 在运行时修改代码是不可接受的。 另外,我注意到还有一些类似的问题,但是他们没有相同的要求。 编辑:额外的说明,我可以通过search所有的窗口find消息框,直到我find一个匹配的标题,然后发送一个WM_CLOSE消息,但我不认为这是一个很好的解决scheme。 我也不能保证消息框已经/将被显示,或者在我的电话将被显示多长时间之后。 它可以立即显示,可以在1200毫秒后显示,也可以根本不显示。

阅读应用程序的清单文件?

有没有简单的方法来读取应用程序已经embedded的清单文件? 我正在考虑一个备用数据stream的线?

如何在进程中使用msinfo32.exe命令行?

我有这个简单的代码: private void MsInfo() { Process proc = new Process(); proc.EnableRaisingEvents = true; proc.StartInfo.UseShellExecute = false; proc.StartInfo.FileName = "msinfo32.exe"; proc.StartInfo.CreateNoWindow = true; proc.StartInfo.Arguments = "/nfo " + contentDirectory + "\\msinfo.nfo"; proc.StartInfo.WorkingDirectory = contentDirectory; proc.Start(); proc.WaitForExit(); proc.Close(); } 我想在目录contentDirectory中创buildmsinfo.nfo。 contentDirectory现在是: C:\ Users \ bout0_000 \ AppData \ Local \ Diagnostic_Tool_Blue_Screen \诊断工具蓝屏\ SF_28-07-13 我想在参数中使用variablescontentDirectory的原因是SF_28-07-13目录每天都在改变。 Tommorow将会是SF_29-07-13 如果我愿意的话: proc.StartInfo.Arguments […]

使用BinaryReader读取大文件(> 1 GB)时,最佳缓冲区大小是多less?

我正在阅读二进制文件,这里是一个示例: public static byte[] ReadFully(Stream input) { byte[] buffer = new byte[16*1024]; int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { …… } } 缓冲区大小(16 * 1024)显然对性能有很大的作用。 我已经读过,它取决于I / O技术( SATA , SSD , SCSI等)以及其上存在的分区的分段大小(我们可以在格式化分区时定义)。 但是这里有一个问题: 是否有任何公式或最佳实践来定义缓冲区大小? 现在,我正在基于反复试验来定义。 编辑:我testing了我的服务器上的应用程序与不同的缓冲区大小,我得到了4095 * 256 * 16(16 MB)的最佳性能! 4096慢了4秒。 这里有一些旧post是非常有帮助的,但我仍然不能得到原因: .NET中更快(不安全)的BinaryReader 最佳文件缓冲区读取大小? 文件I / O与stream – 最佳的内存缓冲区大小 […]

UserControl KeyDown事件不会触发撤销Windows应用程序KeyDown事件

我有UserControl并面临KeyDown事件的问题。 我的UserControls将显示反对撤销Windows窗体keydown事件如下所示: 用户控件的事件: private void UserControl_KeyDown(object sender,KeyEventArgs e) { if ((Keys)e.KeyCode == Keys.Escape) { this.Visible = false; } } 上面的事件将不得不隐藏UserControl,但事件不会因为撤销窗体keydown而触发,如下所示: Windows窗体: private void button1_Click(object sender, EventArgs e) { panel1.SendToBack(); panel2.SendToBack(); panel3.SendToBack(); panel4.SendToBack(); am.Focus(); this.KeyDown -= new KeyEventHandler(Form1_KeyDown); } 这将显示UserControls作为UserControls被添加到Windows窗体,如下所示: private UserControl.UserControl am = new UserControl.UserControl(); public Form1() { InitializeComponent(); this.Controls.Add(am); } 我想撤消对可见的UserControl winform的keydown事件,并激发UserControl的keydown事件隐藏UserControl,但它不是很好。 UserControl事件的keydown事件不是火。 不知道为什么? […]