我遇到基于COM的客户端 - 服务器设置问题.COM服务器使用C#(.NET 4.0)编写,并作为(注册的)本地服务器运行.
根据连接到服务器的应用程序,其他客户端将收到服务器执行失败(HRESULT异常:0x80080005(CO_E_SERVER_EXEC_FAILURE)
这里解释了潜在的问题(在COM部分是完整性感知的部分).我理解它的方式,是由于提升的应用程序创建具有更高完整性级别的服务器这一事实.当另一个未提升的应用程序连接时,不允许连接到同一个实例.当非提升的应用程序创建进程时,在提升的应用程序连接之后也会发生同样的情况.
我试图实现页面上描述的解决方案:修改注册表以设置应允许所有客户端连接的安全描述符.在C++中有一个代码示例,但这在.NET中实际上是相同的:
// Security Descriptor with NO_EXECUTE_UP
var sd = new RawSecurityDescriptor("O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)");
byte[] securityDescriptor = new Byte[sd.BinaryLength];
sd.GetBinaryForm(securityDescriptor, 0);
RegistryKey key = Registry.ClassesRoot.OpenSubKey("AppID\\{APP-ID-GUID}", true);
if (key == null)
{
key = Registry.ClassesRoot.CreateSubKey("AppID\\{APP-ID-GUID}");
}
using (key)
{
key.SetValue("LaunchPermission", securityDescriptor, RegistryValueKind.Binary);
}
Run Code Online (Sandbox Code Playgroud)
但是,这没有达到预期的效果.当第二个客户端尝试创建相关对象的实例时,Windows会尝试启动COM服务器的单独实例,但服务器会阻止两个实例作为同一用户运行.鉴于我设置的权限,我不希望第一个实例启动第二个实例.
由于其中一个客户端应用程序在Medium IL中运行,而另一个客户端应用程序在High IL中运行,因此我还在强制标签上尝试了变体,例如:
O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;ME)
O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)(ML;;NX;;;ME)(ML;;NX;;;HI)
Run Code Online (Sandbox Code Playgroud)
我也尝试ROTFlags按照页面上的建议将注册表项设置为0x1(ROTFLAGS_ALLOWANYCLIENT),但行为仍然没有变化.
我已经确定LaunchPermission注册表值正在以某种方式使用.我无法发现使用Process Monitor读取它的位置,但是当我使用该dcomcnfg.exe工具设置相同的密钥时,我可以通过拒绝启动权限来强制服务器加载失败.
我想指出我的服务器进程不需要提升.如何使提升和非提升的进程都能够连接到单个服务器实例?
我有一个应用程序正在对某些图像执行某些处理.
鉴于我知道宽度/高度/格式等(我这样做),并考虑定义一个缓冲区来存储像素数据:
然后,而不是使用new与delete []上unsigned char*并保持一个单独的说明缓冲区大小的,我想通过使用简化的事情std::vector.
所以我会宣布我的课程是这样的:
#include <vector>
class MyClass
{
// ... etc. ...
public:
virtual void OnImageReceived(unsigned char *pPixels,
unsigned int uPixelCount);
private:
std::vector<unsigned char> m_pImageBuffer; // buffer for 8-bit pixels
// ... etc. ...
};
Run Code Online (Sandbox Code Playgroud)
然后,当我收到一个新图像(一些可变大小 - 但不要担心这些细节)时,我可以调整矢量大小(如果需要)并复制像素:
void MyClass::OnImageReceived(unsigned char *pPixels, unsigned int uPixelCount)
{
// called when a new image is available
if (m_pImageBuffer.size() != uPixelCount)
{
// resize image buffer
m_pImageBuffer.reserve(uPixelCount);
m_pImageBuffer.resize(uPixelCount, 0);
}
// copy …Run Code Online (Sandbox Code Playgroud) 我有一张地图宣称为
std::map<std::string, Texture*> textureMap;
Run Code Online (Sandbox Code Playgroud)
我用它来将纹理文件的路径与实际纹理配对,这样我就可以通过路径引用纹理,而不会为单个精灵加载相同的纹理.我不知道该怎么做才能正确销毁ResourceManager类(地图所在的)的析构函数中的纹理.
我想过使用像这样的迭代器的循环:
ResourceManager::~ResourceManager()
{
for(std::map<std::string, Texture*>::iterator itr = textureMap.begin(); itr != textureMap.end(); itr++)
{
delete (*itr);
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,它说删除预期指针.现在已经很晚了,所以我可能只是错过了一些明显的东西,但我想让它在睡前工作.所以我是关闭还是我完全朝着错误的方向?
使用VS2012,我注意到一个switch已经工作了好几年的东西现在似乎在发布版本中被打破了,但在Debug版本中正常工作(或至少像以前一样).我无法看到代码的任何错误,所以我们会感谢一些关于return在switch块中使用语句的正确性的反馈.
以下代码编译好,但在Win7 32位的Release版本中提供了错误的输出...
#include <stdio.h>
#include <tchar.h>
class CSomeClass
{
public:
float GetFloat(int nInt)
{
printf("GetFloat() - entered\n");
switch (nInt)
{
case 1 :
printf("GetFloat() - case 1 entered\n");
return 0.5F;
case 0 :
printf("GetFloat() - case 0 entered\n");
return 1.0F;
case 2 :
printf("GetFloat() - case 2 entered\n");
return 2.0F;
case 3 :
printf("GetFloat() - case 3 entered\n");
return 3.0F;
case 4 :
printf("GetFloat() - case 4 entered\n");
return 4.0F;
}
printf("GetFloat() - …Run Code Online (Sandbox Code Playgroud) xxx\_vc\atlmfc\include\atlcore.h(638):错误C2039:"SetDefaultDllDirectories":不是"全局命名空间"的成员
#ifndef _USING_V110_SDK71_
// the LOAD_LIBRARY_SEARCH_SYSTEM32 flag for LoadLibraryExW is only supported if the DLL-preload fixes are installed, so
// use LoadLibraryExW only if SetDefaultDllDirectories is available (only on Win8, or with KB2533623 on Vista and Win7)...
IFDYNAMICGETCACHEDFUNCTION(L"kernel32.dll", SetDefaultDllDirectories, pfSetDefaultDllDirectories)
{
return(::LoadLibraryExW(pszLibrary, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32));
}
#endif
Run Code Online (Sandbox Code Playgroud)
其中的功能都没有被VS实现,
所以如何解决这个问题呢?
libray有什么问题吗?我在VS2012中运行这个程序
我有一个std::map,我想在第二个条目开始迭代.
我可以解决这个问题,但我很困惑为什么"明显的"语法不能编译.错误消息没有帮助,因为它引用std::string,我在这里没有使用.
这是一些代码
// Suppose I have some map ...
std::map<int, int> pSomeMap;
// This is fine ...
std::map<int, int>::const_iterator pIterOne = pSomeMap.begin();
++pIterOne;
// This doesn't compile ...
std::map<int, int>::const_iterator pIterTwo = pSomeMap.begin() + 1;
Run Code Online (Sandbox Code Playgroud)
VS2012在上面的行中给出以下错误
错误C2784:'std :: _ String_iterator <_Mystr> std :: operator +(_ String_iterator <_Mystr> :: difference_type,std :: _ String_iterator <_Mystr>)':无法推断'std :: _ String_iterator <_Mystr>'的模板参数来自'int'
谁能解释一下这里发生了什么?
我想知道当我将遗留代码,库代码或示例代码集成到我自己的代码库中时,如何通过重新散列源代码来避免浪费我的时间并冒着打字错误.
如果我举一个简单的例子,基于图像处理场景,你可能会看到我的意思.
发现我正在集成这样的代码片段并不罕见:
for (unsigned int y = 0; y < uHeight; y++)
{
for (unsigned int x = 0; x < uWidth; x++)
{
// do something with this pixel ....
uPixel = pPixels[y * uStride + x];
}
}
Run Code Online (Sandbox Code Playgroud)
随着时间的推移,我已经习惯于做一些事情,比如从内循环中移除不必要的计算,并可能将后缀增量更改为前缀...
for (unsigned int y = 0; y < uHeight; ++y)
{
unsigned int uRowOffset = y * uStride;
for (unsigned int x = 0; x < uWidth; ++x)
{
// do something with this pixel ....
uPixel = …Run Code Online (Sandbox Code Playgroud) 我正在使用VS2012 Ultimate和Project Linker扩展.当我右键单击一个项目并选择添加项目链接...时,我得到此错误弹出窗口.

如果我点击"忽略",将打开正确的对话框,我能够成功链接项目.
任何人都知道这个错误意味着什么?
自从我们的开发和构建环境从VS2008升级到VS2012以来,我对volatile在我们的遗留代码库中使用关键字的含义感到困惑(由于从"旧"时代管理线程有很多复制模式,因此它非常广泛).
Microsoft在VS2012文档中有以下评论:
如果您熟悉C#volatile关键字,或熟悉早期版本的Visual C++ 中volatile的行为,请注意C++ 11 ISO标准volatile关键字不同,并且在
/volatile:iso指定编译器选项时在Visual Studio中受支持.(对于ARM,默认情况下指定).C++ 11 ISO标准代码中的volatile关键字仅用于硬件访问; 不要将它用于线程间通信.对于线程间通信,请使用std::atomic<T>来自C++标准模板库的机制.
它继续说:
当使用
/volatile:ms编译器选项时 - 默认情况下,当ARM以外的体系结构成为目标时 - 除了维护对其他全局对象的引用的排序之外,编译器还会生成额外的代码以维护对volatile对象的引用之间的顺序.
我认为这意味着我们现有的代码不会破坏但不一定是可移植的(对我们来说不是问题).
但是,如果可能的话,它确实提出了这些问题,我希望得到一些建议:
volatile在我们的代码中删除限定符的使用并替换为符合C++ 11 ISO标准的等价物,即使我们不会将代码从MS中移除?我知道这不是一个特定的编程问题,但我们正在进行一些非常重要的重构,我希望能够为这项工作提供一些明智的指导.
我有一个Canny边缘检测到的球的图像(见下面的链接),其中包含许多嘈杂的边缘.什么是最好的图像处理技术,我可以用来删除这些嘈杂的边缘而不删除属于球的边缘?
原始图像

Canny边缘图像

非常感谢大家的帮助和建议,非常感谢!
Ps我试图在使用Circle Hough Transform来检测球之前清理边缘图像.