我使用GetProcessID意外地从应用程序中删除了Win2K兼容性.
我像这样使用它来获取已启动应用程序的主要HWND.
ShellExecuteEx(&info); // Launch application
HANDLE han = info.hProcess; // Get process
cbinfo.han = han;
//Call EnumWindows to enumerate windows....
//with this as the callback
static BOOL CALLBACK enumproc(HWND hwnd, LPARAM lParam)
{
DWORD id;
GetWIndowThreadProcessID(hwnd, &id);
if (id == GetProcessID(cbinfo.han))
setResult(hwnd)
...
}
Run Code Online (Sandbox Code Playgroud)
任何想法如何在Win2K上实现相同的功能?
我经常发现自己使用Integers来表示不同"空格"中的值.例如...
int arrayIndex;
int usersAge;
int daysToChristmas;
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望为"Index","Years"和"Days"这些类型中的每一种都设置单独的类,这样可以防止我意外混淆它们.从documnentation的角度来看,Typedef是一种帮助,但它不够类型安全.
我已经尝试过包装器类,但最终却有太多的样板供我喜欢.是否有一个简单的基于模板的解决方案,或者可能是Boost中准备好的东西?
编辑:有几个人在他们的答案中谈到边界检查.这可能是一个方便的副作用,但不是一个关键要求.特别是,我不仅想要防止越界分配,而且要防止"不适当"类型之间的分配.
我有一个BOOST_FOREACH循环来遍历列表.不幸的是,我还需要将迭代器缓存到特定项目.
typedef List::iterator savedIterator;
BOOST_FOREACH(Item &item, list)
{
// stuff...
if (condition)
savedIterator = &item; // this won't work
// do more stuff...
}
Run Code Online (Sandbox Code Playgroud)
显然我可以使用list.begin().. list.end()for循环,但我已经成长为喜欢BOOST_FOREACH.这有什么方法吗?
我想检查一个特定的文件是否可以通过ShellExecute成功"打开",所以我试图使用AssocQueryString来发现这个.
例:
DWORD size = 1024;
TCHAR buff[1024]; // fixed size as dirty hack for testing
int err = AssocQueryString(0, ASSOCSTR_EXECUTABLE, ".mxf", NULL ,buff , &size);
openAction->Enabled = ((err == S_OK) || (err == S_FALSE)) && (size > 0);
Run Code Online (Sandbox Code Playgroud)
现在,这几乎可行.如果有注册的应用程序,我会得到字符串.
但是,有一个问题:在Vista上,即使没有注册的应用程序,它返回应用程序c:\ Windows\System32\shell32.dll是关联的,这是带来100%无用的东西"Windows无法打开这个文件:使用Web服务找到正确的程序?" 对话.
显然我想要隐藏最终用户的cr*p,但简单地将返回的字符串与常量进行比较似乎是一种丑陋,暴力和脆弱的方式.
此外,黑客入侵注册表以完全禁用此对话框不是一个好主意.
什么是更好的选择?
使用'标准'VCL拖放事件OnDragOver和OnDragDrop,如何区分"复制"和"移动"操作?
我似乎没有可用的TDragType,并且键盘Shift状态不会传递给这些事件.
我有使用Microsoft Visual Studio 6.0在Windows NT上编译的C代码.我正在使用Windows XP将此代码迁移到新计算机.什么IDE适合这个?我不认为MS Visual 6.0是专为XP设计的......我可以使用Visual Studio C++编译C代码并保持相同的功能吗?
我试图在某些C++代码中使用第三方SDK.虽然SDK和标题在技术上与C++兼容,但它实际上只是一堆讨厌的C.
特别是主头文件有数百个#defines,其中这些最差.
#define C 0 //Celsius
#define F 1 //Fahrenheit
#define R 2 // Rankine
#define K 3 // Kelvin
Run Code Online (Sandbox Code Playgroud)
现在,您可以想象在尝试使用包含类似内容的boost库时,我得到的错误消息:
template< typename F > struct template_arity;
Run Code Online (Sandbox Code Playgroud)
一些战术#undefs可以解决问题,但它仍然像一颗定时炸弹.我也可以重写第三方标题的大部分内容,或者只是尝试隔离我真正需要的部分.
有没有更好的解决方案来解决这个问题?
请考虑以下代码:
class A
{
public:
A() {}
~A() {}
};
class B: public A
{
B() {}
~B() {}
};
A* b = new B;
delete b; // undefined behaviour
Run Code Online (Sandbox Code Playgroud)
我的理解是C++标准说删除b是未定义的行为 - 即,任何事情都可能发生.但是,在现实世界中,我的经验是始终调用~A(),并正确释放内存.
如果B引入任何具有自己的析构函数的类成员,它们将不会被调用,但我只对上面的简单案例感兴趣,其中使用继承可能修复一个类方法中的错误,源代码是不可用.
显然,这不是你想要的非平凡情况,但它至少是一致的.对于显示的代码,您是否了解上述情况未发生的任何 C++实现?
我想知道Indy 9 TIdTCPServer的当前客户端连接数(在Delphi 2007上)
我似乎无法找到一个给出这个的属性.
我已尝试在服务器OnConnect/OnDisconnect事件上递增/递减计数器,但当客户端断开连接时,该数字似乎永远不会减少.
有什么建议?
我为旧版RADStudio提供了一些派生类,只需重新实现Read,Write,Seek方法以及Size和Position属性.
我希望将这些移植到XE3,但我看到现在(例如)有三个重载Read- 原始的一个,加上两个以TBytes作为参数.
德尔福
function Read(var Buffer; Count: Longint): Longint; overload; virtual;
function Read(Buffer: TBytes; Offset, Count: Longint): Longint; overload; virtual;
function Read(var Buffer: TBytes; Count: Longint): Longint; overload;
Run Code Online (Sandbox Code Playgroud)
C++
virtual int __fastcall Read(void *Buffer, int Count)/* overload */;
virtual int __fastcall Read(System::DynamicArray<System::Byte> Buffer, int Offset, int Count)/* overload */;
int __fastcall Read(System::DynamicArray<System::Byte> &Buffer, int Count)/* overload */;
Run Code Online (Sandbox Code Playgroud)
我需要实现这三个,还是只需一个?如果只有一个,哪一个......?
通常情况下,我可以从VCL源代码中找到它,但我目前只有试用版(无源代码).
c++ ×6
delphi ×3
boost ×2
winapi ×2
windows ×2
c ×1
class ×1
delphi-xe3 ×1
destructor ×1
foreach ×1
ide ×1
include ×1
indy ×1
iterator ×1
shellexecute ×1
tcpserver ×1
templates ×1
tstream ×1
vcl ×1
visual-c++-6 ×1