小编Col*_*nee的帖子

解决多个CRT问题

我知道有一些类似的问题,但我不认为他们真的有与我相同的要求.

我们的DLL是使用Visual Studio 2005编译的,由于安装限制,必须与特定版本的CRT链接.这是绝对的,用最新版本重新编译它不是一个解决方案.

我们最近更新了Boost库.但是,当我构建Boost时,它会自动使用最新的CRT.现在,当我将Boost与我们的程序联系起来时,它会对CRT的最新(错误)版本和CRT的旧(正确)版本产生依赖关系.需要依赖最新版本.

这个问题的最佳解决方案是什么?目前,我能想到的最好的是使用旧版本重建Boost,但我不知道如何在不修改源代码的情况下轻松完成.

如果有办法强制Visual Studio全局使用特定版本的CRT(而不是基于每个项目),那将是很好的.或者只是简单地删除最新版本的CRT,但我很确定这是不可能的,因为我认为它被认为是操作系统的一部分.

c dependencies boost msvcrt visual-studio

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

Visual Studio探查器提供错误VSP1033(不包含已识别的可执行文件)

我正在尝试使用Visual Studio的性能工具来分析C++ DLL.我创建了一个针对我的DLL的分析会话,进入它的属性,并覆盖启动设置以运行加载此DLL的可执行文件.

当我尝试启动探查器时,我得到: Error VSP1033: The file 'C:\src\mam\bin\Profile\Win32\Helper.dll' does not contain a recognized executable image.这使得它似乎正在尝试启动DLL,但它确实使用可执行文件的名称生成一个空报告.

有什么方法可以解决这个问题吗?

profiling native-code visual-studio-2012

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

我是否可以牺牲一致性以允许并发"插入或更新"以及使用SQL Server读取对单个表的访问权限?

我有一个包含两列的表:一个资源键,以及(非常粗略地)上次访问它时.

我有许多服务器定期转储有关对表的资源访问的数据.如果资源密钥已经存在,它们应该更新资源密钥的访问时间,如果不存在,则应该插入它.

另一台服务器很少从该表生成报告.

我不要求此表保持一致.我很好,报告服务器在转储过程中读取表格.如果两个写入服务器尝试更新同一行,我不关心哪个获取它的数据.

有两个主要问题:

  1. 我正在寻找甚至可能与SQL Server?
  2. 如果可能的话,我可能会让多个服务器竞争"插入或更新"并导致主键约束违规.有什么方法可以解决这个问题吗?

sql t-sql sql-server

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

Windows TCP 套接字默认启用 SO_KEEPALIVE 吗?

我遇到了一个关于 TCP 套接字的奇怪错误。似乎SO_KEEPALIVE默认情况下在所有套接字上都启用了。

我写了一个简短的测试用例来创建一个套接字并连接到服务器。紧随连接后,我检查SO_KEEPALIVEgetsockopt。该值不为零,根据 MSDN,这意味着启用了保持活动。也许我误解了这一点。

我最近有一个奇怪的错误,服务器连续两次断开连接。某些客户端处于已发送登录信息并正在等待响应的状态。即使有一个重叠WSARecv发布到连接到服务器的套接字,也没有发布完成通知客户端服务器崩溃,所以我假设套接字没有完全关闭。

大约 2 小时后(实际上大约 1 小时 59 分 19 秒),一个完成数据包被发布用于读取,通知客户端连接不再打开。这是我开始怀疑的地方SO_KEEPALIVE

我试图理解为什么会发生这种情况。这引起了一些问题,因为由于任何原因失去连接的客户端都应该自动重新连接到服务器;在这种情况下,因为没有通知断开连接,客户端直到 2 小时后才重新连接。

一个明显的解决方法是设置超时,但我想知道这种情况是如何发生的。

SO_KEEPALIVE 我的应用程序服务器或客户端没有在套接字上设置。

// Error checking is removed for this snippet, but all winsock calls succeed.
int main() {
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD(2, 2);
    err = WSAStartup(wVersionRequested, &wsaData);

    SOCKET foo = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, 0);

    DWORD optval;
    int optlen = sizeof(optval);
    int test = 0; …
Run Code Online (Sandbox Code Playgroud)

c windows tcp winsock keep-alive

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

如何从std :: function获取基本函数类型?

我有很多类的typedef,std::function<void(PARAMS)>其中PARAMS特定于每个类.我需要根据参数的数量和第一个参数的类型进行专门化.我想用boost::function_traits它,但为了使用它,我需要有相关的原始函数类型std::function.

例如,给定std::function<void(int,int)>,我想要检索void(int,int).

有没有办法以可移植的方式提取本机类型?作为旁注,我无法访问C++ 11功能.

c++ function tr1 type-traits

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

如何忽略 LNK2038(定义不匹配)?

可能的重复:
LNK2038,迭代器不匹配错误,需要忽略

我有一个第三方静态库,它也与 C/C++ 运行时静态链接。我只有这个库的发布版本。

当我尝试将此库链接到我的应用程序的调试版本时,链接器抱怨静态库的迭代器调试级别 (0) 与我的应用程序的级别 (2) 不匹配。

有没有办法强制链接器忽略这个错误?我希望能够在调试模式下使用此库添加的功能,并且无法获得此库的调试版本。

顺便说一句,我无法立即想到这种定义不匹配会引起的任何问题。

c++ linker-errors visual-studio

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

为什么GetMessage不处理WM_POWERBROADCAST消息?

我正在创建一个隐藏窗口来处理消息.我遇到我在GetMessage循环中没有收到WM_POWERBROADCAST消息.但是,我会通过我的WNDPROC收到它.我已经确认我确实在这两个位置都收到了其他消息.

为什么GetMessage没有收到WM_POWERBROADCAST?

WNDCLASSEX classInfo = {0};
classInfo.cbSize = sizeof(classInfo);
classInfo.style = WS_DISABLED;
// CustomWndProc just outputs the message and chains to DefaultWndProc
classInfo.lpfnWndProc = CustomWndProc; 
classInfo.hInstance = GetModuleHandle(NULL);
classInfo.hCursor = NULL;
classInfo.hbrBackground = NULL;
classInfo.lpszMenuName = NULL;
classInfo.lpszClassName = L"MyMessageWindow";
ATOM windowClass = RegisterClassEx(&classInfo);

HWND messageWindow = CreateWindowEx(WS_EX_NOACTIVATE, L"MyMessageWindow", 
    L"Message Handling Window", WS_DISABLED, 0, 0, 0, 0, 0, NULL, 
    GetModuleHandle(NULL), NULL);

MSG message;
while (GetMessage(&message, NULL, 0, 0))
{
    // This condition is never true.
    if (message.message == WM_POWERBROADCAST)
        std::cout …
Run Code Online (Sandbox Code Playgroud)

winapi windows-messages

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

通过引用投掷非常设临时工

通过非const引用在try-block中抛出构造在堆栈上的对象,捕获并修改它,然后引用另一个catch块抛出它有什么问题吗?

以下是我所指的内容的简短示例.

struct EC {
    EC(string msg) { what = msg; }
    string where;
    string what;

    void app(string& t) { where += t; }
    string get() { return what; }
};

try {
    try {
        try {
            EC error("Test");
            throw error;
        }
        catch (EC& e) {
            e.app("1");
            throw e;
        }
    }
    catch (EC& e) {
        e.app("2");
        throw e;
    }
}
catch (EC& e) {
     e.app("3");
     cout << e.where << endl;
     cout << e.get() << endl;
}
Run Code Online (Sandbox Code Playgroud)

是否有可能导致e.what包含垃圾,但是e.在哪里保持完整?例如:
e.where是"123"
e.get()返回大量垃圾数据,直到碰巧遇到空字节.

c++ exception undefined-behavior

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

如何将DynamoDB属性设置为空列表?

我正在尝试使用适用于.NET的AWS开发工具包中的DynamoDBv2库,通过更新请求将DynamoDB文档中的属性设置为空列表。

我尝试了显而易见的更新表达式,但没有成功:

// Fails, expression attribute values cannot contain an empty list
...
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
    { ":empty", new AttributeValue { L = new List<AttributeValue> { } } },
},
UpdateExpression = "SET #P.MyList = :empty",
...
Run Code Online (Sandbox Code Playgroud)

我该如何实现?

c# amazon-dynamodb aws-sdk

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

为什么我的原子操作以意想不到的顺序发生?

我不明白为什么会这样.拿下以下的伪代码:

volatile unsigned long count = 0;
volatile unsigned long sum = 0;

void ThreadFunction() {
    InterlockedIncrement(&count);
    InterlockedExchangeAdd(&sum, rand());
}

int main() {
    for (int i = 0; i < 10; ++i) {
        // This is the problematic instruction
        InterlockedExchange(&count, 0);
        InterlockedExchange(&sum, 0);

        std::vector<boost::thread> threads(i);
        for (int j = 0; j < i; ++j)
            threads[j] = boost::thread(ThreadFunction);

        while (count != i)
            Sleep(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

在程序的第一次运行时i = 0,sum主线程的原子交换通常生成的线程完成发生.操作count总是以正确的顺序发生.

这只发生一次; 它以正确的顺序为循环的其余部分执行操作.它并不总是发生,但它通常会发生.如果我在原子添加之前进入调试器或睡眠,则指令将以正确的顺序执行.

无论哪种方式,结果是线程写入的值被替换为在线程被启动之前应该发生的0. …

c++ windows winapi multithreading atomic

0
推荐指数
1
解决办法
334
查看次数