我有一个像这样的函数来获取进程'id的名字,但它总是返回0我尝试的每个进程:
DWORD GetProcessId(std::string ProcessName)
{
HANDLE hsnap;
PROCESSENTRY32 pt;
DWORD PiD;
hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pt.dwSize = sizeof(PROCESSENTRY32);
do {
if (!strcmp(pt.szExeFile, ProcessName.c_str())) {
CloseHandle(hsnap);
PiD = pt.th32ProcessID;
return PiD;
if (PiD != NULL) {
return 0;
}
}
} while (Process32Next(hsnap, &pt));
return 1;
}
Run Code Online (Sandbox Code Playgroud)
主要功能:
int main()
{
DWORD pid = GetProcessId("calc.exe");
std::cout << pid;
if (pid == 0) { printf("error 1"); getchar(); }//error
return 0;
}
Run Code Online (Sandbox Code Playgroud) 当发生未处理的异常时,我想打印堆栈跟踪而不是仅仅终止.我试过这样做SetUnhandledExceptionFilter:
SetUnhandledExceptionFilter(UnhandledException);
...
LONG WINAPI UnhandledException(LPEXCEPTION_POINTERS exceptionInfo)
{
printf("An exception occurred which wasn't handled!\nCode: 0x%08X\nAddress: 0x%08X",
exceptionInfo->ExceptionRecord->ExceptionCode,
exceptionInfo->ExceptionRecord->ExceptionAddress);
return EXCEPTION_EXECUTE_HANDLER;
}
Run Code Online (Sandbox Code Playgroud)
我发现这个代码工作正常.但是也有因为没有另外的信息ExceptionCode,并ExceptionAddress在系统"事件查看器"打印反正.如果可以打印完整的堆栈跟踪,那么我可以确定发生异常的确切位置?
我发现此代码https://code.google.com/p/m0d-s0beit-sa/source/browse/src/main.cpp?r=9ceb4fec21d647b169c72851d7882bef2b9c5a8a它部分解决了我的问题.仅打印出现异常的方法.但是不打印异常类型和行号.
我有一个没有调用它的ON_EN_CHANGE事件的 Richedit 控件。我还有一个ON_EN_KILLFOCUS正在使用的事件,它运行良好。该ON_EN_CHANGE甚至没有进入事件块,但它的映射声明。有谁知道可能会出什么问题?
如果有帮助,我也有与(常规的,而不是丰富的)编辑控件相结合的旋转控件,这些编辑控件ON_EN_CHANGE事件工作正常。
我惊讶地发现T在以下代码中无法成功推断:
template <typename T>
void Set(T* a,T b)
{
*a = b;
}
void Test()
{
unsigned long a;
Set(&a, 1);
}
Run Code Online (Sandbox Code Playgroud)
VC++抱怨模棱两可:
1>test.cpp(10): error C2782: 'void Set(T *,T)' : template parameter 'T' is ambiguous
1> test.cpp(32) : see declaration of 'Set'
1> could be 'int'
1> or 'unsigned long'
Run Code Online (Sandbox Code Playgroud)
显然这可以通过改变呼叫来解决,Set(&a, 1ul);但我的问题是为什么这是必要的?
为什么不能T使用指针的类型推导出来,哪个应该是明确的?
有没有办法重写模板,以便原始调用Set成功编译?
什么是TCHAR字符串,例如LPTSTR和LPCTSTR我如何使用它们?当我在Visual Studio中创建一个新项目时,它为我创建了这个代码:
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
例如,我如何连接所有命令行参数?
如果我想打开第一个命令行参数给出的名称的文件,我该怎么做?Windows API定义了许多函数的"A"和"W"版本,例如CreateFile,CreateFileA和CreateFileW; 那么这些如何彼此不同以及我应该使用哪一个?
这个问题实际上分为两部分.为了简要介绍这个问题,我们要求使用一个名为ArtCam的工具生成CNC文件(与Roland铣床一起使用),并修改它以移动被切割图案的绝对位置.
软件以下列形式生成并且机器接受输入文件:
;;^IN;
!MC1;
!RC5000;
V50.0;
^PR;Z0,0,10500;
^PA;
V49.8;
Z0,0,1000;
V39.8;
Z0,0,100;
Z10,0,99;
Z1000,0,-13;
Z10,0,-124;
Z0,0,-125;
...thousands more Zx,y,z; instructions...
Run Code Online (Sandbox Code Playgroud)
我的问题的第一部分是,任何人都可以告诉我这个文件格式是什么?它显然不是G-Code,我无法在任何地方找到任何参考或文档.
第二部分是,有没有人知道我们如何轻松修改这些文件削减的模式的绝对位置.显然Z线是X,Y,Z位置命令,但我不知道它们是绝对的还是相对的,我不知道它们在什么坐标空间/系统中.据我所知,我们可以在顶部添加一个简单的命令来移动起点,或者我们可能需要重写所有Z行,但是如果没有关于文件格式的一些信息,我就处于死胡同.
谢谢!
我正在 UNICODE 模式下构建我的应用程序,并希望将 CString 转换为 LPWSTR。基本上,我有一个包含 CString 作为成员变量的类,例如,
class MyClass
{
CString TreeNodeName;
}
Run Code Online (Sandbox Code Playgroud)
我想使用以下结构将项目插入树控件中,
TVINSERTSTRUCT tvInsert;
tvInsert.hParent = ParentNode;
tvInsert.hInsertAfter = NULL;
tvInsert.item.mask = TVIF_TEXT;
tvInsert.item.lParam = (long)ClassObject;
tvInsert.item.pszText = ClassObject->TreeNodeName; //Need this conversion
Run Code Online (Sandbox Code Playgroud)
请帮我如何转换CString TreeNodeName;到tvInsert.item.pszText?
以下代码将一些文本设置为打开的记事本窗口.我的问题是它如何安全地工作?
int _tmain(int argc, _TCHAR* argv[])
{
HWND hwnd = FindWindow(_T("Notepad"),_T("Untitled - Notepad"));
if(hwnd!=NULL)
{
wchar_t* pString = L"hi";
HWND hwndEdit = FindWindowEx(hwnd,NULL,_T("Edit"),NULL);
SendMessage(hwndEdit,WM_SETTEXT,0,(LPARAM)pString);
}
return 0;
Run Code Online (Sandbox Code Playgroud)
}
指针"pString"存在于当前进程空间的虚拟内存中,在notepad.exe的上下文中可能不是有效的内存地址.但奇怪的是它确实正确设置了文本,这意味着不仅指针在notepad.exe上下文但它也指向正确的字符串.这是怎么回事?
这是否意味着我们可以有效地使用SendMessage作为IPC机制?
我使用createprocess API从我的主应用程序调用了另一个应用程序.但另一个过程也需要一些参数作为参数.
我创建了以下过程:
BOOL ret= CreateProcess( NULL, szCmdline, NULL, NULL, TRUE, 0, NULL, NULL,&siStartInfo, &piProcInfo);
Run Code Online (Sandbox Code Playgroud)
szCmdline是变量,它包含应用程序的完整路径.
知道如何通过这个过程传递参数.
谢谢,
我有50台中的一台计算机从SetProcessDpiAwareness返回非零结果,我找不到任何关于它的信息.我将DPI意识设置为不知情.我有一台计算机返回值105621835743232(十进制).它似乎仍然将DPI Awareness设置为不应该意识到它应该但是会给出一个不期望的返回值.
Private Declare Function SetProcessDpiAwareness Lib "shcore.dll" (ByVal Value As PROCESS_DPI_AWARENESS) As Long
Private Function SetDPI() As Long
'Results from SetProcessDPIAwareness
'Const S_OK = &H0&
'Const E_INVALIDARG = &H80070057
'Const E_ACCESSDENIED = &H80070005
Dim lngResult As Long
lngResult = SetProcessDpiAwareness(PROCESS_DPI_AWARENESS.Process_DPI_Unaware)
Return lngResult
End Function
Run Code Online (Sandbox Code Playgroud)
这是一个clickonce winforms应用程序,所以我不能使用清单来设置DPI.
任何有关定位文档的帮助都会受到欢迎!
提前致谢.