我尝试读取进程的所有提交页面(Win7-64).在大多数页面上它可以工作,但几页失败.我无法解释原因.这是我的测试程序(编译x32,在Win7-64中测试):
#include <windows.h>
void main()
{
HANDLE hProc = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId());
SYSTEM_INFO si;
ZeroMemory(&si,sizeof(SYSTEM_INFO));
GetSystemInfo(&si);
char* buf = new char[si.dwPageSize];
for (unsigned i = 0; i < 0x7fff0; i++)
{
void* baseOffs = (void*) (i * si.dwPageSize);
MEMORY_BASIC_INFORMATION mbi;
ZeroMemory(&mbi,sizeof(MEMORY_BASIC_INFORMATION));
if (VirtualQueryEx(hProc, baseOffs, &mbi, sizeof(MEMORY_BASIC_INFORMATION)) == 0)
{
MessageBox(NULL, TEXT("VirtualQueryEx failed"),TEXT(""),MB_OK);
}
if (mbi.State == MEM_COMMIT)
{
SIZE_T numByteWritten = 0;
if(ReadProcessMemory(hProc, baseOffs,buf,si.dwPageSize,&numByteWritten) == FALSE)
OutputDebugString(TEXT("bad\n")); //GetLastError()==ERROR_PARTIALLY_READ; numByteWritten == 0;
else
OutputDebugString(TEXT("good\n"));
}
}
delete[] buf;
}
Run Code Online (Sandbox Code Playgroud)
我厌倦了查看失败页面的MEMORY_BASIC_INFORMATION,但我没有发现任何奇怪的东西.失败页面的数量也因运行而异(平均约为5).什么阻止我阅读这些页面?我是否需要调整进程令牌中的某些权限?
这个错误:
每次我在Jmeter中运行一个测试脚本时都会出现.一切正常......
实际脚本运行后,每次在日志中出现此错误.
我可以忽略这个错误吗?或者它会影响我的测试?
Jmeter: 2.13
Java: 1.8.0.45
Jmeter插件: 1.3(Standard,Extras,ExtraLibs,Webdriver)
使用以下代码,我试图检索kernel32.dll版本,以执行Windows版本检查.但是,由于某种原因,即使kernel32.dll版本(如文件属性中所示)是10.0.10586.0,返回的版本是:6.2.10586.0怎么来的?
DWORD dwDummy;
DWORD dwFVISize = GetFileVersionInfoSize(lpszFilePath, &dwDummy);
LPBYTE lpVersionInfo = new BYTE[dwFVISize];
if (GetFileVersionInfo(lpszFilePath, 0, dwFVISize, lpVersionInfo) == 0)
{
return FALSE;
}
UINT uLen;
VS_FIXEDFILEINFO *lpFfi;
BOOL bVer = VerQueryValue(lpVersionInfo, L"\\", (LPVOID *)&lpFfi, &uLen);
if (!bVer || uLen == 0)
{
return FALSE;
}
DWORD dwFileVersionMS = lpFfi->dwFileVersionMS;
DWORD dwFileVersionLS = lpFfi->dwFileVersionLS;
delete[] lpVersionInfo;
DWORD dwLeftMost = HIWORD(dwFileVersionMS);
DWORD dwSecondLeft = LOWORD(dwFileVersionMS);
DWORD dwSecondRight = HIWORD(dwFileVersionLS);
DWORD dwRightMost = LOWORD(dwFileVersionLS);
Run Code Online (Sandbox Code Playgroud)
我能得到的创建日期,文件大小等,为一个文件,使用下面的代码:
// Error handling removed for brevity
HANDLE hFile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
LARGE_INTEGER fileSize;
GetFileSizeEx(hFile, &fileSize);
FILE_BASIC_INFO fileInfo);
GetFileInformationByHandle(hFile, FileBasicInfo, fileInfo, sizeof(fileInfo));
Run Code Online (Sandbox Code Playgroud)
但是当针对目录调用时,所有值都设置为零 - 如何获取目录信息?
谢谢
我的Visual Studio 2005 C#项目有问题.自星期一以来,我一直在Windows XP下使用它.然后我的笔记本电脑坏了,在我的新笔记本电脑上我有Windows 7 64位,我仍在使用VS 2005.
编译源代码没有问题,但是当我运行程序时它会在下面的行中断
OdbcConnection cn;
cn = new OdbcConnection("dsn=My_dsn_name;");
Run Code Online (Sandbox Code Playgroud)
我收到错误:
EnrtyPointNotFoundExcepition未被取消
无法在DLL'kernel32.dll'中找到名为'InterlockedIncrement'的入口点
我正在尝试使用PostgresODBC 64位驱动程序连接Postgres 8.4数据库.
欢迎任何解决方案或解决方法.我需要强调的是,我正在构建的解决方案需要在Windows XP 32bit下运行.
更新了有关该问题的信息(来自我对评论的回复,但不仅仅是):
编辑:我在上面添加了1-3点.
我正在与客户进行现场工作,我正在努力帮助他们解决一个复杂的问题.我希望Delphi中有一个工具或功能,我们可以用它来查看内部工作,以帮助我们找到问题所在.
以下是我们正在处理的问题的高级概述.这是一个商业应用程序,目前部署在Delphi 5中.在过去的一年中,该应用程序已迁移到Delphi XE.迁移几乎完成,但遇到了一些严重的错误.
应用程序本身非常庞大,有数百个单元和许多第三方和自定义组件.在我们遇到的一个特定情况中,创建主窗体,然后在显示主窗体之前终止应用程序.结果是在终止期间发生崩溃,因为单元正在最终确定.
调试器正在破坏kernel32的RaiseException函数,该函数由NotifyNonDelphiException调用.我们尝试设置一个非破坏断点,从NotifyNonDelphiException中记录调用堆栈,但这并没有给我们任何有用的东西.调用堆栈仅包含处理异常的方法,即RtlRaiseStatus和KUserExceptionDispatcher.
我们如何识别抛出NotifyNonDelphiException正在处理的原始异常的代码?
编辑:这是在一个异常实例后捕获的两个图像.第一个是引发异常,第二个描述异常对话框关闭后的CPU窗口.
新编辑:
我发布这个问题已经有一个多星期了,各种答案给我留下了深刻的印象.对最初问题的一些评论是最有价值的,但是一些答案本身非常有用.
我对该客户的访问已经结束,我将要求他们考虑已在此处发布的答案.虽然我们无法追踪错误的实际来源,但错误的原因显而易见.多年来在没有严重重构的情况下对用户界面进行调整,使应用程序的登录过程不稳定.当用户取消登录时,主表单处于部分初始化状态.当不允许此过程运行时,这是用户中止登录时发生的情况,存在非常严重的终结问题.
该公司购买了AQTime Pro以帮助识别未来的问题,但需要重新设计登录过程,并且从长远来看将解决问题.
有一次,我考虑删除这个问题,但我选择保留它,因为我相信其他人会发现许多优秀的建议,这些建议已经发布了信息.
目前,我接受了@Deltics的答案,因为我讨厌在没有答案的情况下留下问题.但是,我要求这个问题的观众也考虑所有其他答案和评论,它们同样有价值.
我想制作一个INI读卡器GetPrivateProfileString
.我在用什么:
public class Config
{
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);
private string path;
public Config(string path)
{
this.path = path;
}
public string PopValue(string section, string key)
{
StringBuilder sb = new StringBuilder();
GetPrivateProfileString(section, key, "", sb, sb.Length, path);
return sb.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的INI文件:
[mysql]
host=localhost
Run Code Online (Sandbox Code Playgroud)
我用的是:
Console.WriteLine(Configuration.PopValue("mysql", "host"));
Run Code Online (Sandbox Code Playgroud)
但是,它只打印出一个空行而不是localhost
.我究竟做错了什么?
我正在尝试P /调用SetFileTime,但似乎无法正常工作。它总是为我返回5的错误代码(访问被拒绝),我不确定为什么。这是我正在使用的代码:
void Main()
{
var pointer = CreateFile(@"C:\Users\User\Desktop\New folder\New Text Document.txt", FileAccess.ReadWrite, FileShare.None, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);
Console.WriteLine(pointer);
var now = DateTime.Now.ToFileTime();
long lpCreationTime = now;
long lpLastAccessTime = now;
long lpLastWriteTime = now;
if (!SetFileTime(pointer, ref lpCreationTime, ref lpLastAccessTime, ref lpLastWriteTime))
Console.WriteLine(GetLastError());
CloseHandle(pointer);
}
[DllImport("kernel32.dll")]
static extern UInt32 GetLastError();
[DllImport("kernel32.dll", SetLastError = true)]
static extern Boolean SetFileTime(IntPtr hFile, ref long lpCreationTime, ref long lpLastAccessTime, ref long lpLastWriteTime);
[DllImport("kernel32.dll", SetLastError = true)]
static extern Boolean CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll", CharSet …
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个 Java 应用程序,该应用程序读取笔记本电脑电池的状态,并在电量不足时向用户发送通知。为了做到这一点,我将 jna 与 Kernel32 本机库一起使用,如该问题的第一个答案中所述: 如何在 Windows 系统中获得剩余电池寿命?
运行示例,程序产生以下输出:
ACLineStatus: Offline
Battery Flag: High, more than 66 percent
Battery Life: Unknown
Battery Left: 0 seconds
Battery Full: 10832 seconds
Run Code Online (Sandbox Code Playgroud)
电池寿命和电池剩余字段在 Kernel32 BatteryLifePercent和BatteryLifeTime值中读取,它们是 255(未知)和 0(我没有得到这个值。根据此处的 Microsoft 文档,未知将为 -1:https : //msdn.microsoft .com/en-us/library/windows/desktop/aa373232(v=vs.85).aspx )。
我的问题是:为什么我要取回这些值?Windows 电池托盘图标显示正确的百分比,那么为什么我无法从这里获取该数据?
我正在运行 64 位 Windows 7 Ultimate Edition。
谢谢你。
要将用Delphi编写的应用程序添加到Windows应用商店,我必须禁用内部更新机制.例如,通过商店政策10.2.5禁止"检查更新"等内容
所以,我IsRunningAsUwp()
在DesktopBridgeHelpers项目代码中找到了C#helper函数.我的计划是将该帮助器转换为Delphi代码,但是packageFullName
这里的字符串总是空的,即使我通过DesktopBridge转换的项目运行应用程序:
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern int GetCurrentPackageFullName(ref int packageFullNameLength, StringBuilder packageFullName);
public bool IsRunningAsUwp()
{
if (IsWindows7OrLower)
{
return false;
}
else
{
int length = 0;
StringBuilder sb = new StringBuilder(0);
int result = GetCurrentPackageFullName(ref length, sb);
sb = new StringBuilder(length);
result = GetCurrentPackageFullName(ref length, sb);
return result != APPMODEL_ERROR_NO_PACKAGE;
}
}
Run Code Online (Sandbox Code Playgroud)
我当前(不工作)的Delphi转换如下所示:
function GetCurrentPackageFullName(out Length: DWORD; out fullName: String): DWORD; stdcall; external kernel32 delayed; …
Run Code Online (Sandbox Code Playgroud)