#include <shlwapi.h> #pragma comment(lib, 'shlwapi.lib')
TCHAR szFilePath[MAX_PATH] = {0}; DWORD dwError = GetModuleFileName(NULL, szFilePath, ARRAYSIZE(szFilePath)); if(dwError > 0) { PathRemoveFileSpec(szFilePath); printf(_T('The App path is: %s\n'), szFilePath); } else { printf(_T('GetModuleFileName error\n')); }
在C#中,有时会用到非托管代码(比如C++)定义的函数接口等,而有些函数是带有回调的。这时通常我们需要在托管代码(C#)中通过委托的方式实现此回调函数。但是有时就会碰到下面这样的错误: 检测到 XXXXXXXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 一般只调用一次回调函数时,不会出现这种情况。出现这种情况,是由于多次调用了回调函数,而且回调函数是在局部被new出来的。要避免这个错误的发生,需要将回调函数实例化为成员变量,这样就不会被垃圾回收了。 比如: class A { public delegate void ACallback(String msg); public void FuncA(ACallback callback, String msg) { &n 函数原型: BOOL WINAPI CreateProcess( __in LPCTSTR lpApplicationName, __in_out LPTSTR lpCommandLine, __in LPSECURITY_ATTRIBUTES lpProcessAttributes, __in LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles, __in DWORD dwCreationFlags, __in LPVOID lpEnvironment, __in LPCTSTR lpCurrentDirectory, __in LPSTARTUPINFO lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInformation, ); 请注意:第二个参数的类型是LPTSTR,而不是LPC 1. 如果是启动一个新的进程显示一个窗口,可以如下实现: STARTUPINFO si = {0}; si.cb = sizeof si; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNOACTIVATE; PROCESS_INFORMATION pi = {0}; TCHAR path[MAX_PATH] = _T('notepad.exe'); CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
2. 如果是在当前程序显示一个非模态的对话框而不激活该窗口的话。 假设当前项目是一个对话框程序,CTestDlg类为主对话框,当点击CTestDlg的确定按钮的时候显示不激活的对话框CNoActiveDlg,则: 在CTestDlg类中定义CNoActiveDlg *m_dlgNoActive 在CTestDlg的OnInitDialog()中创建对话框: m_dlgNoActive = new CNoActiveDlg(); m_dlgNoActive->Create(IDD_DLG_NO_ACTIVE); 在CTestDlg的OnOk()中: m_dlgNoActive->ShowWindow(SW_SHOWNOACTIVATE); 这样当点击CTestDlg的确定按钮时,就会显示CNoActiveDlg窗口且此窗口未激活,激活窗口依然是CTestDlg。 如果想让资源管理器(explorer)每次打开一个文件夹时都启用新的窗口,可以使用如下方式: c++: ShellExcute(NULL, 'explore', 'c:\\', NULL, NULL, SW_SHOWNORMAL); c#: Win7: System.Diagnostics.Process.Start('explorer.exe', @'c:\'); xp: 还未找到方法 如果想让资源管理器(explorer)每次打开一个文件夹时,如果该文件夹已经打开,则只显示已打开的文件夹,而不是新起一个窗口,可以使用如下方式: c++: ShellExcute(NULL, 'open', 'c:\\', NULL, NULL, SW_SHOWNORMAL); 或者 ShellExcute(NULL, NULL, 'c:\\', NULL, NULL, SW_ (2010-05-26 16:28)效果 ![](http://image80.360doc.com/DownloadImg/2014/12/0811/47858359_2) 代码片段:
Window1.xaml文件
<Window x:Class='CheckBoxTreeView.Window1' xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' xmlns:l='clr-namespace:CheckBoxTreeView' Title='Window1' Height='300' Width='300'> <Window.Resources> <Resou (2010-05-26 14:35) 在Win7的资源管理器中,如果我们选中【文件夹选项】->【查看】->【文件和文件夹】->【使用复选框以选择项】。则可通过列表项上的复选框实现多选,而不再需要按【Ctrl】或【Shift】键。WPF中没有对应的控件,但是利用WPF我们可以比较容易实现此功能。 讨论 首先,CheckBox的选中状态应该和ListViewItem的选中状态保持一致,故需要将CheckBox的IsChecked属性和ListViewItem的IsSelected属性绑定到一起。 其次,CheckBox的可见性应该在ListViewItem被选中或鼠标移动到其上面时可见,故需要把CheckBox的Visibility属性复合绑定到ListViewItem的IsMouseOver属性和IsSelected属性上。 效果 实现后的效果如图所示: ![](http://pubimage.360doc.com/wz/default.gif)
摘自MSDN #include <windows.h> #include <crtdbg.h> #include <netfw.h> #include <objbase.h> #include <oleauto.h> #include <stdio.h> HRESULT WindowsFirewallInitialize(OUT INetFwProfile** fwProfile) { HRESULT hr = S_OK; INetFwMgr* fwMgr = NULL; INetFwPolicy* fwPolicy = NULL; _ASSERT(fwProfile != NULL); *fwProfile = NULL; // Create an instance of the firewall settings manager. hr = CoCreateInstance( __uuidof(NetFwMgr), NULL, CLSCTX_INPROC_SERVER, &n
|