这个问题似乎很容易,但由于某种原因,我很难找到答案.
我有一个应用程序将表单的大小和位置保存在INI文件中.这一切都很好,但是当你最大化时关闭应用程序时,它将保存表单的大小和位置最大化而不是其状态.
我的意思是,在下一次运行时,表单将显示最大化,而实际上它已"恢复"但覆盖整个桌面.
有没有办法保存最大化事件之前的表单大小,然后保存表单最大化的事实.从INI文件中读取的内容是否在最大化状态下创建表单并将其"恢复"大小设置为最大化事件之前的大小?
谢谢!
我可以使用 SuspendThread() 挂起另一个进程的线程。有没有办法完全暂停该进程的执行?如果是,请发布代码。
谢谢。
PS:既然你会问“你为什么要这样做”,我就把它贴在这里。我正在处理不再维护的遗留软件。我无权访问源代码。现在我需要它暂停,直到文件充满数据,然后恢复执行。
我只是试图通过SSL使用只有C来获取WinInet HTTP POST.我知道这是可能的.任何好的示例代码?
非常感谢!
编辑:以下代码似乎在使用WinHTTP的C++下正常工作,但我需要WinInet:
TCHAR szTemp[512] = {0};
BOOL bRet = FALSE;
HINTERNET hRequest = NULL;
HINTERNET hSession = NULL;
HINTERNET hConnect = NULL;
CERT_CONTEXT *pCert = {0};
HCERTSTORE hCertStore = NULL;
DWORD dwRet = 0;
DWORD dwLen = 0;
DWORD dwFlags = SECURITY_FLAG_IGNORE_CERT_CN_INVALID|
SECURITY_FLAG_IGNORE_CERT_DATE_INVALID|
SECURITY_FLAG_IGNORE_UNKNOWN_CA;
CString szUserAgent("Mozilla/4.0 (compatible; MSIE 5.22)");
if ( m_csServer.GetLength() < 3 ) {
_stprintf_s( szTemp, 512, _T("Server name is invalid or empty") );
::MessageBox(NULL, szTemp, _T("ERROR"), MB_OK );
return;
}
hSession = WinHttpOpen(szUserAgent,
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, …Run Code Online (Sandbox Code Playgroud) 我在使用Vista UAC(C Windows)的CreateDesktop()中询问了这一点 我设置了赏金,但是在试图拒绝唯一的答案时,"接受"被错误地按下了(我已经醒了超过48小时).所以我再问一遍.
我正在使用CreateDesktop()来创建一个临时桌面,其中应用程序将运行,执行清理操作(同时保持不受影响)并终止.一旦应用程序消失,我就关闭了桌面.使用Windows XP甚至Vista时,一切都很好.启用(恼人的)UAC时会出现问题.
创建桌面时一切正常,但是当您调用CreateProcess()在该桌面上打开程序时,会导致打开的应用程序崩溃,User32.dll上出现异常.
我一直在阅读很多关于Windows上不同桌面和图层以及内存限制的内容.但是,我打开的大多数程序(作为测试场景)都可以,但是一些程序(如IE,Notepad,Calc和我自己的应用程序)会导致崩溃.
任何人都知道为什么会在使用UAC的Vista上发生这种情况,或者更具体地针对这些特定程序?以及如何解决这个问题?
任何人都有一个很好的例子来说明如何创建一个桌面并在那里打开一个应用程序,而无需在Vista下使用UAC切换到它?
代码表示赞赏.
谢谢
使用的代码是
SECURITY_ATTRIBUTES sa;
HDESK dOld;
HDESK dNew;
BOOL switchdesk, switchdesk2, closedesk;
int AppPid;
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
//Get handle to current desktop
dOld = OpenDesktopA("default", 0, TRUE, DESKTOP_SWITCHDESKTOP|
DESKTOP_WRITEOBJECTS|
DESKTOP_READOBJECTS|
DESKTOP_ENUMERATE|
DESKTOP_CREATEWINDOW|
DESKTOP_CREATEMENU);
if(!dOld)
{
printf("Failed to get current desktop handle !!\n\n");
return 0;
}
//Make a new desktop
dNew = CreateDesktopA("kaka", 0, 0, 0, DESKTOP_SWITCHDESKTOP|
DESKTOP_WRITEOBJECTS|
DESKTOP_READOBJECTS|
DESKTOP_ENUMERATE|
DESKTOP_CREATEWINDOW|
DESKTOP_CREATEMENU, …Run Code Online (Sandbox Code Playgroud) 好的,我在这里有点困惑.以下代码有效:
HANDLE CreateSideThread()
{
DWORD dwGenericThread;
HANDLE hThread1 = CreateThread(NULL, 0, CallBackFunc, NULL, 0, &dwGenericThread);
return hThread1;
}
int main()
{
HANDLE Thread1;
Thread1 = CreateSideThread();
WaitForSingleObject(hThread1, INFINITE);
SomeOtherFunction();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序做其他事情,但你明白了.它基本上创建一个新线程并执行它在CallBackFunc中的任何内容(这是一个检查db状态的无限循环).现在,如果我删除WaitForSingleObject(),那么程序甚至不会尝试一次CallBackFunc并执行SomeOtherFunction().什么是线程的重点?我的意思是,我在这里很困惑.
我想要做的是调用该线程检查数据库状态,并在我继续我的程序,调用其他函数时保持该线程.
我究竟做错了什么?请发布一个示例代码段.
谢谢
好的,我希望我能正确解释这个.我有一个结构:
typedef struct _MyData
{
char Data[256];
int Index;
} MyData;
Run Code Online (Sandbox Code Playgroud)
现在,我遇到了一个问题.大多数情况下,MyData.Data可以使用256,但在某些情况下,我需要将它可以容纳的字符数量扩展到不同的大小.我不能使用指针.有没有办法在运行时调整数据大小?怎么样?代码表示赞赏.
谢谢
编辑:
虽然我非常感谢所有的评论,但"也许试试这个......"或"那样做",或"你是什么东西是错的......"评论没有帮助.代码是这里的帮助.如果您知道代码后面的答案,请继续.
和:
1-不能使用指针.请不要试图弄清楚为什么,我只是不能 - 结构被注入到另一个程序的内存中.这就是为什么.没有指针.
抱歉这里有点粗糙,但我在这里问了一个问题,因为我已经尝试了所有可能有用的不同方法.再次,我正在寻找代码.在这一点上,我对"可能工作......"或"你考虑过这个......"不感兴趣
谢谢你,我再次道歉
编辑2
为什么这个设置得到回答?
我有一个DWORD值,在Hex中可能看起来像:
DWORD Val = 0xFF01091A
Run Code Online (Sandbox Code Playgroud)
我怎样才能读取每个字节?我的意思是,如何阅读FF,01,09和1A?
谢谢!
有没有办法检查当前用户是否可以写入注册表?更具体地说,如果它不是管理员,可以写入HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER上的策略键.
我尝试使用LookupPrivilegeValue(),但我不认为这是正确的做法.
代码表示赞赏.
我正在使用以下代码(这是MSDN略有修改的示例)来检查我是否对进程具有调试权限.如果我不这样做,我会尝试设置它们.
int SetDebugPriv()
{
HANDLE TokenHandle;
LUID lpLuid;
TOKEN_PRIVILEGES NewState;
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &TokenHandle))
{
//failed
return 0;
}
if(!LookupPrivilegeValue(NULL, "SeDebugPrivilege" , &lpLuid))
{
//failed
CloseHandle(TokenHandle);
return 0;
}
NewState.PrivilegeCount = 1;
NewState.Privileges[0].Luid = lpLuid;
NewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(TokenHandle, FALSE, &NewState, sizeof(NewState), NULL, NULL))
{
//failed
CloseHandle(TokenHandle);
return 0;
}
CloseHandle(TokenHandle);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
现在,在Windows XP和2003的某个帐户下,我在尝试设置令牌时收到拒绝访问错误.我的猜测是我无法设置该特定令牌,因为我无权这样做.如何在非管理员帐户或具有低权限的帐户上设置调试令牌?
代码表示赞赏.
谢谢