小编Rog*_*and的帖子

允许连接到具有不匹配完整性级别的.NET COM服务器

我遇到基于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工具设置相同的密钥时,我可以通过拒绝启动权限来强制服务器加载失败.

我想指出我的服务器进程不需要提升.如何使提升和非提升的进程都能够连接到单个服务器实例?

.net c# com uac

54
推荐指数
1
解决办法
1814
查看次数

将std :: vector用作简单缓冲区是一种好习惯吗?

我有一个应用程序正在对某些图像执行某些处理.

鉴于我知道宽度/高度/格式等(我这样做),并考虑定义一个缓冲区来存储像素数据:

然后,而不是使用newdelete []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)

c++ std stdvector

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

正确销毁std :: map中的指针

我有一张地图宣称为

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)

但这不起作用,它说删除预期指针.现在已经很晚了,所以我可能只是错过了一些明显的东西,但我想让它在睡前工作.所以我是关闭还是我完全朝着错误的方向?

c++ pointers destructor stl

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

从C++ 11中的"switch"语句"返回"现在是错误的吗?

使用VS2012,我注意到一个switch已经工作了好几年的东西现在似乎在发布版本中被打破了,但在Debug版本中正常工作(或至少像以前一样).我无法看到代码的任何错误,所以我们会感谢一些关于returnswitch块中使用语句的正确性的反馈.

以下代码编译好,但在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)

c++ c++11 visual-studio-2012

24
推荐指数
3
解决办法
7357
查看次数

错误C2039:"SetDefaultDllDirectories":不是全局命名空间的成员

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中运行这个程序

mfc

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

为什么我不能做std :: map.begin()+ 1?

我有一个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 :: _ St​​ring_iterator <_Mystr> std :: operator +(_ String_iterator <_Mystr> :: difference_type,std :: _ St​​ring_iterator <_Mystr>)':无法推断'std :: _ St​​ring_iterator <_Mystr>'的模板参数来自'int'

谁能解释一下这里发生了什么?

c++ stl visual-c++ visual-studio-2012

9
推荐指数
2
解决办法
7338
查看次数

关于C/C++编译器优化我能想到什么?

我想知道当我将遗留代码,库代码或示例代码集成到我自己的代码库中时,如何通过重新散列源代码来避免浪费我的时间并冒着打字错误.

如果我举一个简单的例子,基于图像处理场景,你可能会看到我的意思.

发现我正在集成这样的代码片段并不罕见:

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)

c++ compiler-optimization visual-c++

8
推荐指数
1
解决办法
504
查看次数

VS2012项目链接器错误

我正在使用VS2012 Ultimate和Project Linker扩展.当我右键单击一个项目并选择添加项目链接...时,我得到此错误弹出窗口.

错误

如果我点击"忽略",将打开正确的对话框,我能够成功链接项目.

任何人都知道这个错误意味着什么?

visual-studio-2012

8
推荐指数
1
解决办法
198
查看次数

在VS2012中使用'volatile'关键字的最佳做法

自从我们的开发和构建环境从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对象的引用之间的顺序.

我认为这意味着我们现有的代码不会破坏但不一定是可移植的(对我们来说不是问题).

但是,如果可能的话,它确实提出了这些问题,我希望得到一些建议:

  1. 我们是否应该volatile在我们的代码中删除限定符的使用并替换为符合C++ 11 ISO标准的等价物,即使我们不会将代码从MS中移除?
  2. 如果我们不这样做,是否有任何缺点?

我知道这不是一个特定的编程问题,但我们正在进行一些非常重要的重构,我希望能够为这项工作提供一些明智的指导.

c++ visual-c++ c++11 visual-studio-2012

7
推荐指数
1
解决办法
629
查看次数

Canny Edge Image - 去除噪音

我有一个Canny边缘检测到的球的图像(见下面的链接),其中包含许多嘈杂的边缘.什么是最好的图像处理技术,我可以用来删除这些嘈杂的边缘而不删除属于球的边缘?

原始图像

原版的

Canny边缘图像

谨慎的

非常感谢大家的帮助和建议,非常感谢!

Ps我试图在使用Circle Hough Transform来检测球之前清理边缘图像.

image-processing edge-detection

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