我记得在我最后一年的大学项目中我编写了一个C#注册表监视器,然而,当我将它与Microsoft ProcessMonitor应用程序进行比较时(我记不清它的确切名称,但是它是由MSoft收购的公司),我没有捕获尽可能多的注册表调用.
这是因为我使用的是C#包装器,因此它只会捕获用户模式注册表访问吗?
我使用了这个包装器:http://www.codeproject.com/KB/DLL/EasyHook64.aspx
为了捕获内核模式注册表访问,我必须用C++编写?
C API函数分配输出或让用户指定输出缓冲区是一个好主意吗?例如:
BOOL GetString(
PWSTR *String
);
...
PWSTR string;
GetString(&string);
Free(string);
Run Code Online (Sandbox Code Playgroud)
VS
BOOL GetString(
PWSTR Buffer,
ULONG BufferSize,
PULONG RequiredBufferSize
);
...
// A lot more code than in the first case
Run Code Online (Sandbox Code Playgroud)
更具体地说,我想知道为什么Win32 API主要使用第二种情况(例如GetWindowText,LookupAccountSid).如果API函数知道输出有多大,为什么用户会尝试猜测输出大小?我找不到有关为何使用第二种情况的任何信息.
另外:LookupAccountSid示例特别糟糕.在内部,它使用LSA API,为调用者分配输出.然后LookupAccountSid让用户在只能从LSA返回输出时分配缓冲区(并猜测正确的缓冲区大小)!为什么?
我有一个带有选项卡控件的Win32 GUI程序,每个选项卡都有一个列表视图控件.每当调整窗口大小时,都会出现大量闪烁.我尝试过以下的事情:
这是RegisterClassEx代码:
memset(&wcex, 0, sizeof(WNDCLASSEX));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = PhMainWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = PhInstanceHandle;
wcex.hIcon = LoadIcon(PhInstanceHandle, MAKEINTRESOURCE(IDI_PROCESSHACKER));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
//wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MAINWND);
wcex.lpszClassName = PhWindowClassName;
wcex.hIconSm = (HICON)LoadImage(PhInstanceHandle, MAKEINTRESOURCE(IDI_PROCESSHACKER), IMAGE_ICON, 16, 16, 0);
Run Code Online (Sandbox Code Playgroud)
WM_SIZE处理程序:
RECT rect;
// Resize the tab control.
GetClientRect(PhMainWndHandle, &rect);
MoveWindow(TabControlHandle, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top, TRUE);
// Resize the list …Run Code Online (Sandbox Code Playgroud) 我想将a转换byte*为a byte[],但我也希望有一个可重用的函数来执行此操作:
public unsafe static T[] Create<T>(T* ptr, int length)
{
T[] array = new T[length];
for (int i = 0; i < length; i++)
array[i] = ptr[i];
return array;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是我收到编译器错误,因为T可能是".NET托管类型",我们无法指向那些.更令人沮丧的是,没有泛型类型约束可以将T限制为"非托管类型".是否有内置的.NET函数来执行此操作?有任何想法吗?
我的程序有7,667,712个字节的已提交堆,但它有33,546,240个保留堆字节!我可以看到该程序使用大约44 MB的专用字节.如何让.NET GC为托管堆保留更少的空间?