我有一个使用MS ATL库编写的COM对象.我在IDL中声明了一堆枚举,但在使用MS COM对象查看器工具查看类型库时它们不会出现.问题似乎是缺少的枚举实际上并没有被任何COM方法用作参数 - 我如何强制这些枚举出现?
例如,在IDL中:
// Used by Foo method, so appears in the type library
typedef enum FOO
{
FOO_1,
FOO_2,
} FOO;
// Not used by any method, so won't appear in the type library
typedef enum BAR
{
BAR_1,
BAR_2,
} BAR;
[id(1)] HRESULT Foo([in] FOO eFoo);
Run Code Online (Sandbox Code Playgroud)
即使所讨论的枚举没有被任何方法直接使用,它们对使用该对象的任何人仍然有用,但我不能让它们导出.
谁看过这个吗?
假设我有一个类foo,并希望使用std :: map存储一些boost :: shared_ptrs,例如:
class foo;
typedef boost::shared_ptr<foo> foo_sp;
typeded std::map<int, foo_sp> foo_sp_map;
foo_sp_map m;
Run Code Online (Sandbox Code Playgroud)
如果我向地图添加新的foo_sp但已使用的密钥已存在,是否会删除现有条目?例如:
foo_sp_map m;
void func1()
{
foo_sp p(new foo);
m[0] = p;
}
void func2()
{
foo_sp p2(new foo);
m[0] = p2;
}
Run Code Online (Sandbox Code Playgroud)
当原始指针(p)被p2替换时,它是否会被释放?我很确定它会,但我认为值得询问/分享.
显示如何使用MFC创建线程的示例代码将线程函数声明为静态和__cdecl.为什么需要后者?提升线程不打扰这个惯例,所以它只是一个时代错误吗?
例如(MFC):
static __cdecl UINT MyFunc(LPVOID pParam)
{
...
}
CWinThread* pThread = AfxBeginThread(MyFunc, ...);
Run Code Online (Sandbox Code Playgroud)
而提升:
static void func()
{
...
}
boost::thread t;
t.create(&func);
Run Code Online (Sandbox Code Playgroud)
(代码示例可能不是100%正确,因为我不在IDE附近).
__cdecl有什么意义?它在创建线程时有何帮助?
我是SVN的新手并且大量使用外部属性.我的PC上有一个存储库,外部属性在名称中有一个硬编码的"localhost",现在给我带来了问题.例如:
/project1/trunk
/shared/trunk
Run Code Online (Sandbox Code Playgroud)
project1/trunk取决于共享文件夹,因此具有svn:// localhost/shared/trunk的svn:externals属性.这与TortoiseSVN一起工作正常,我可以结帐并给我一份副本.project1/trunkshared/trunk
现在我已经将存储库移动到另一个服务器,并且由于显而易见的原因,外部链接不再起作用(TortoiseSVN正在尝试检出svn://localhost/shared/trunk哪些不再存在).
所以我需要更新我的所有外部 - 但我不想硬编码任何机器名称 - 所以我该如何使这项工作?请记住,存储库可能会在某个时刻再次移动.围绕SVN手册,我遇到了^ /语法,所以我尝试了以下内容:
svn:externals shared ^/shared/trunk
Run Code Online (Sandbox Code Playgroud)
这被接受但是当我尝试project1在我的电脑上签出一份副本时,我收到以下错误:
Unrecognized format for the relative external URL 'shared'.
Check the path and/or URL you've entered.
Run Code Online (Sandbox Code Playgroud)
除非我在外部硬编码存储库机器名称,否则我无法使其工作 - 这似乎是一种黑色艺术,所以任何建议都会受到欢迎.
我是一个用ATL编写的COM对象,它是从C++应用程序中使用的,我想在两者之间传递一组BYTE.到目前为止,我对COM/IDL的体验仅限于传递简单类型(BSTR,LONG等).
是否有一种相对简单的方法让COM对象将数组传递给调用者?例如,我想传递原始图像(TIFF)而不是弄乱临时文件.
在创建新的C++标头/源文件时,您将哪些信息添加到顶部?例如,您是否添加了日期,您的姓名,文件说明等?您是否使用结构化格式来获取此信息?
例如
// Foo.cpp - Implementation of the Foo class
// Date: 2008-25-11
// Created by: John Smith
Run Code Online (Sandbox Code Playgroud)
我认识的一个团队将CVS提交消息嵌入到每个文件的脚下,但我不确定我是否想要走这么远......
我已经检查了我的应用程序的特定Subversion分支.称之为'1.0'.我一直在做一些更改,添加一些新文件等,但还没有提交更改.但是,我不想将更改提交到"1.0"分支.相反,我想将我的更改提交到新的"1.1"分支.
据我所知,我需要首先查看"1.0"分支的新副本,然后创建一个名为"1.1"的新Subversion分支,然后在提交之前手动复制我的待处理更改.
有更简单的方法吗?
几年前,在我久违的查尔斯Petzold的Windows 3.0的编程书的副本,有一个神奇的COLORREF或RGB值记录,你可以用它来检查你是否应该以浅色或深色绘制文本.例如,如果背景颜色低于此值,则使用黑色文本,如果更高,则使用白色文本.有谁知道/记住这个神奇的价值是什么?
我在C++中做了很多Win32编程,许多Win32结构都有一个'size'(通常称为cbSizeor length)成员作为第一个需要在进行相关API调用之前设置的元素.例如:
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
Run Code Online (Sandbox Code Playgroud)
现在,我认为将结构成员初始化为零是一个好习惯,我可以这样做:
WINDOWPLACEMENT wp = { };
Run Code Online (Sandbox Code Playgroud)
要么
WINDOWPLACEMENT wp = { 0 };
Run Code Online (Sandbox Code Playgroud)
但是,如果我像这样初始化第一个成员,那么结构的其他成员会发生什么:
WINDOWPLACEMENT wp = { sizeof(WINDOWPLACEMENT) };
Run Code Online (Sandbox Code Playgroud)
它们是否自动初始化为零?或者它取决于我正在使用哪个编译器以及它是否是调试版本?
是否可以在不使用 Visual Studio 的情况下开发 Windows 驱动程序(特别是类似 PDF 的打印机驱动程序,在屏幕上显示数据而不是实际打印)?我正在考虑使用免费的 C++ 工具,例如 MinGW/gcc。