小编xMR*_*MRi的帖子

使用c ++逐行读取字符串

std::string有多行,我需要逐行阅读.请用一个小例子告诉我如何做到这一点.

例如:我有一个字符串 string h;

h将是:

Hello there.
How are you today?
I am fine, thank you.
Run Code Online (Sandbox Code Playgroud)

我需要提取Hello there.,How are you today?I am fine, thank you.莫名其妙.

c++

35
推荐指数
3
解决办法
5万
查看次数

Xamarin构建错误:错误APT0000:在<declare-styleable> ...中,无法找到属性

我收到了另一位开发人员的项目.我安装了我的机器.已配置具有所需组件的VS-2017.

Android SDK-Manager已安装相应的版本.Project配置为使用编译Android 7.1 (Nougat).

开始构建我得到一个错误

1>ERROR : error APT0000: In <declare-styleable> AppBarLayout, unable to find attribute android:keyboardNavigationCluster
Run Code Online (Sandbox Code Playgroud)

我不清楚,我是否需要设置此信息,或者是否需要此信息.

我收到了ERROR:在MenuView中,无法找到属性android:preserveIconSpacing错误:在SherlockSpinner中,无法找到属性android:popupPromptView.这两篇文章都没有帮助.

我重新检查了SDK-Tools,删除了该文件夹C:\Users\<user>\AppData\Local\Xamarin.

据我所知,该消息缺少一个属性,需要设置.

Resource.designer.cs我找到的项目文件中

public const int AppBarLayout_android_keyboardNavigationCluster = 2;
Run Code Online (Sandbox Code Playgroud)

名称接缝完全匹配.

有人能解释我这个错误吗?

有人可以解释我如何摆脱它以及如何解决未来类似的问题?

c# android xamarin.android xamarin visual-studio-2017

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

使用ATL子类化在Windows 10 64bit上随机崩溃

从一开始:自2017年3月1日起,这是Microsoft确认的错误.最后阅读评论.

简短的介绍:

我在使用MFC,ATL的大型应用程序中随机崩溃.在所有这些情况下,ATL子类化用于窗口的简单操作窗口(移动,调整大小,设置焦点,绘画等)后,我在随机执行地址上崩溃.

首先它看起来像一个狂野的指针或堆损坏,但我将完整的场景缩小到一个非常简单的应用程序使用纯ATL和只有Windows API.

要求/我使用的场景:

  • 该应用程序是使用VS 2015 Enterprise Update 3创建的.
  • 该程序应编译为32位.
  • 测试应用程序使用CRT作为共享DLL.
  • 该应用程序在Windows 10 Build 14393.693 64bit下运行(但我们在Windows 8.1和Windows Server 2012 R2下都有repros,全部是64位)
  • atlthunk.dll的版本为10.0.14393.0

该应用程序的作用:

它只是创建一个框架窗口,并尝试使用Windows API创建许多静态窗口.创建静态窗口后,此窗口将使用ATL CWindowImpl :: SubclassWindow方法进行子类化.在子类操作之后,发送简单的窗口消息.

怎么了:

不是每次运行,但是应用程序经常会在SendMessage上崩溃到子类窗口.在257窗口(或256 + 1的另一个倍数)上,子类以某种方式失败.创建的ATL thunk无效.似乎新子类函数的存储执行地址不正确.将任何消息发送到窗口会导致崩溃.callstack总是一样的.callstack中最后一个可见和已知的地址位于atlthunk.dll中

atlthunk.dll!AtlThunk_Call(unsigned int,unsigned int,unsigned int,long) Unknown
atlthunk.dll!AtlThunk_0x00(struct HWND__ *,unsigned int,unsigned int,long)  Unknown
user32.dll!__InternalCallWinProc@20()   Unknown
user32.dll!UserCallWinProcCheckWow()    Unknown
user32.dll!SendMessageWorker()  Unknown
user32.dll!SendMessageW()   Unknown
CrashAtlThunk.exe!WindowCheck() Line 52 C++
Run Code Online (Sandbox Code Playgroud)

调试器中抛出的异常显示为:

Exception thrown at 0x0BF67000 in CrashAtlThunk.exe: 
0xC0000005: Access violation executing location 0x0BF67000.
Run Code Online (Sandbox Code Playgroud)

或另一个样本

Exception thrown at 0x2D75E06D in CrashAtlThunk.exe: 
0xC0000005: Access violation …
Run Code Online (Sandbox Code Playgroud)

c++ atl windows-10 visual-studio-2015 visual-studio-2017

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

我在 VS-2019 中缺少添加新项目 Add "MFC Class From Typelib"

我已经为我的 VS-2019 Porfessional 安装了所有 MFC 的东西。

我想念以前版本中用于创建简单 IDispatch 包装器的添加新项“来自 Tyspelib 的 MFC 类”。

我检查了所有内容,并安装了与 VS-2017 相同的东西。我在 VS-2017 版本中看到了这一点。

我错过了什么?

com mfc visual-studio-2019

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

LVCOLUMN.iSubItem的目的是什么?

我不明白是什么目的LVCOLUMN.iSubItem.这就是MSDN所说的:

iSubItem

Type: int

Index of subitem associated with the column.
Run Code Online (Sandbox Code Playgroud)

我首先想到这意味着当我创建一个列时,我可以为列设置索引,例如:123,然后当我想将一些数据插入列时,我只提供数字123作为标识专栏.

但它不起作用,无论我设置哪些索引列,列仍然编号为0,1,2,3 ......

winapi listview

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

WM_NCHITTEST和HTTRANSPARENT阻止来自消息循环的输入

我们有一个用户可定义的"仪表板".可以在此窗口中添加多个组件.一些窗口是浏览器控件(使用CLSID_WebBrowser创建的ActiveX控件).此浏览器控件可以显示内部Web中不同来源的内容.

为了避免阻止应用程序,每个浏览器控件都托管在自己的线程中.这里的原因是ActiveX Webbrowser控件托管在STA中,只在消息循环运行时加载和显示数据,这可能会阻止UI的其他部分.

因此,我们有一个父窗口,其中包含类型列表控件,树控件,静态和组框的子窗口,以及一些浏览器控件.除浏览器控件外,所有控件都属于同一UI线程.但线程使用一个输入队列,并为每个线程执行AttachThreadInput以将其附加到主线程.

现在我们面临以下问题:

当用户使用组合框和网页控件设计他的屏幕时.当用户将鼠标移到浏览器控件上并单击或使用鼠标滚轮时,应用程序会锁定.应用程序锁定并不接受任何进一步的输入.如果您最小化应用程序并再次激活它,您可以继续工作并再次接受输入.

原因

使用我们发现的调试器和spy ++,任何鼠标事件都会导致WM_NCHITTEST被发送到组框.组框返回HTTRANSPARENT.但底层窗口是一个不同的线程.我们可以看到无限循环发生WM_NCHITEST消息被触发到组框,输入被阻塞,直到这个循环被中断(通过显示桌面最小化).

我们可以在文档中读到WM_NCHITTEST和HTTRANSPARENT仅限于同一线程的窗口.我可以在网上找到另外两篇描述相同或类似问题的文章.

简单的解决方案

简单的解决方案只是要注意浏览器控件永远不会被组框或静态控件所覆盖.所以改变Z顺序很简单并且有效(groupbox必须遵循Z顺序中不同线程的窗口)

如果有另一种解决这个问题的方法,我会感兴趣.或者,如果有办法防止此类输入队列死锁.或者如果有人知道这个WM_NCHITTEST必须处理来自不同线程的窗口时内部发生了什么.

user-interface winapi mfc multithreading

6
推荐指数
0
解决办法
735
查看次数

定义只能从注册它的同一个EXE创建的COM类

  1. 如果主线程中有一个带有STA的EXE
  2. 在EXE内,创建带有另一个STA的第二个线程。
  3. 带有STA的第二个线程应使用CoRegisterClassObject公开一个类工厂,该工厂只能从该过程中使用。

当我将CoRegisterClassObject与CLSCTX_INPROC_SERVER和REGCLS_MULTIPLEUSE一起使用时,主线程使用CLSCTX_ALL创建对象时,出现错误“类未注册”。

当我将CoRegisterClassObject与CLSCTX_LOCAL_SERVER和REGCLS_MULTIPLEUSE一起使用时,主线程可以创建该对象。但是程序的下一个实例将在第一个进程内创建thze对象。

在CoCreateInstance中使用CLSCTX_INPROC标志将始终表示未注册该类。

顺便说一句:因为我总是在程序启动时自己注册该类,所以除了所需的typelib以外,没有其他注册表项。

我为什么需要这样做的更详细的解释:创建的类使用在EXE上下文中内部创建的指针和函数。试想一下,我正在编程一个“应用程序”对象,该对象应仅支持该进程内部的功能以及此会话管理的文件和对象。我需要这个COM对象,因为它在VBScripting Host内部使用,并且再次暴露给其他COM对象。

有没有办法注册仅支持从我的EXE内部创建的类工厂?

com multithreading

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

如何在 VisualStudio 中取消长时间运行的自定义构建工具的构建过程?

我有一个自定义构建步骤。在这一步中,我有一个大型长时间运行的工具来将数据库转换为特殊的静态压缩格式。该工具处理近 2GB 的数据并运行 30 分钟。

这些工具处理 Ctrl+C 和 Ctrl+Break。从命令行运行时可以轻松停止。

但是在 VisualStudio 中(我目前使用的是 VS2015),我无法停止这个工具的运行。当我选择Build -> Cancel. 但我的工具继续运行。

看来 VS 不处理它启动的进程的中断信号。

在不使用任务管理器的情况下,是否有任何技巧或设置可以在构建过程中中止工具?

msbuild build visual-studio visual-studio-2015

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

无法在VS 2015中找到用于创建Visual C++ Windows服务的模板

我的Visual Studio 2015在Visual C++中没有Windows Service的模板.解决方法是创建具有服务类型的ATL项目,但是为VB和VC#而不是VisualC++创建模板没有意义.

windows service winapi visual-studio visual-c++

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

如何在C++中用户在一行中输入数组元素

我是c++新手,基本上属于PHP。所以我试图编写一个程序只是为了练习,对数组进行排序。我已经成功创建了具有静态数组值的程序,即

// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector


bool myfunction (int i,int j) { return (i<j); }

struct myclass { bool operator() (int i,int j) { return (i<j);} } myobject;

int main () {
   int myints[] = {55,82,12,450,69,80,93,33};
  std::vector<int> myvector (myints, myints+8);               

  // using default comparison (operator <):
  std::sort (myvector.begin(), myvector.begin()+4);           

  // using function as comp
  std::sort (myvector.begin()+4, myvector.end(), myfunction); 

  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     

  // print …
Run Code Online (Sandbox Code Playgroud)

c++ arrays iostream

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

在Win32 API ListView中添加带换行符的文本

我正在使用WC_LISTVIEW控件创建一个在运行时填充数据的表.桌子工作正常.但是,我无法在一个单元格中显示多行.

有没有办法使用换行符(例如\n)?

这是我创建表的方式:

HWND listViewErrors = CreateWindow(WC_LISTVIEW, L"",
    WS_VISIBLE | WS_BORDER | WS_CHILD | LVS_REPORT | LVS_SINGLESEL,
    17, 27, errorsRect.Width() - 12, errorsRect.Height() - 25,
    GetWindowHandle(), (HMENU)ID_LIST_ERRORS, NULL, 0);
Run Code Online (Sandbox Code Playgroud)

我添加这样的行:

LVITEM lvi = { 0 };

lvi.mask = LVIF_TEXT;
lvi.pszText = L"Label of an entry";

int ret = ListView_InsertItem(hwndList, &lvi); // Main item

if (ret >= 0)
{
    ListView_SetItemText(
            hwndList,
            ret,
            1,
            L"A description containing\nline breaks, but the\nline breaks will be\nignored."); // Sub item
}

return ret;
Run Code Online (Sandbox Code Playgroud)

结果是换行符( …

c++ winapi

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