小编Rod*_*ddy的帖子

替代Windows 2000的GetProcessID

我使用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上实现相同的功能?

c++ windows winapi

4
推荐指数
2
解决办法
3740
查看次数

C++中的多个Integer类

我经常发现自己使用Integers来表示不同"空格"中的值.例如...

int arrayIndex;
int usersAge;
int daysToChristmas;
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望为"Index","Years"和"Days"这些类型中的每一种都设置单独的类,这样可以防止我意外混淆它们.从documnentation的角度来看,Typedef是一种帮助,但它不够类型安全.

我已经尝试过包装器类,但最终却有太多的样板供我喜欢.是否有一个简单的基于模板的解决方案,或者可能是Boost中准备好的东西?

编辑:有几个人在他们的答案中谈到边界检查.这可能是一个方便的副作用,但不是一个关键要求.特别是,我不仅想要防止越界分配,而且要防止"不适当"类型之间的分配.

c++ templates boost class

4
推荐指数
4
解决办法
1324
查看次数

访问BOOST_FOREACH循环中的迭代器

我有一个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.这有什么方法吗?

c++ foreach boost iterator

4
推荐指数
1
解决办法
5724
查看次数

如何查找是否可以通过ShellExecute打开文档?

我想检查一个特定的文件是否可以通过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,但简单地将返回的字符串与常量进行比较似乎是一种丑陋,暴力和脆弱的方式.

此外,黑客入侵注册表以完全禁用此对话框不是一个好主意.

什么是更好的选择?

c++ winapi shellexecute

4
推荐指数
1
解决办法
1385
查看次数

检查Delphi中的复制与移动拖放

使用'标准'VCL拖放事件OnDragOver和OnDragDrop,如何区分"复制"和"移动"操作?

我似乎没有可用的TDragType,并且键盘Shift状态不会传递给这些事件.

delphi vcl drag-and-drop

4
推荐指数
1
解决办法
1301
查看次数

在Windows XP中编译C代码

我有使用Microsoft Visual Studio 6.0在Windows NT上编译的C代码.我正在使用Windows XP将此代码迁移到新计算机.什么IDE适合这个?我不认为MS Visual 6.0是专为XP设计的......我可以使用Visual Studio C++编译C代码并保持相同的功能吗?

c windows ide visual-c++-6

4
推荐指数
1
解决办法
2314
查看次数

如何处理daft头文件

我试图在某些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可以解决问题,但它仍然像一颗定时炸弹.我也可以重写第三方标题的大部分内容,或者只是尝试隔离我真正需要的部分.

有没有更好的解决方案来解决这个问题?

c++ include

4
推荐指数
1
解决办法
125
查看次数

使用非虚拟析构函数的未定义行为 - 这是一个现实问题吗?

请考虑以下代码:

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++实现?

c++ destructor undefined-behavior

4
推荐指数
1
解决办法
531
查看次数

如何使用Indy TIdTCPServer跟踪客户端数量

我想知道Indy 9 TIdTCPServer的当前客户端连接数(在Delphi 2007上)

我似乎无法找到一个给出这个的属性.

我已尝试在服务器OnConnect/OnDisconnect事件上递增/递减计数器,但当客户端断开连接时,该数字似乎永远不会减少.

有什么建议?

delphi indy tcpserver

4
推荐指数
1
解决办法
1万
查看次数

Delphi XE3中Streams的基础读/写方法是什么?

我为旧版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源代码中找到它,但我目前只有试用版(无源代码).

delphi tstream delphi-xe3

4
推荐指数
2
解决办法
369
查看次数