问题标签 [afx]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - MFC扩展dll资源加载问题
我已经构建了以下配置:
- A) 具有 2 个 MFC 对话框的 MFC 扩展 DLL。
- B) 使用 DLL A 函数的 MFC 常规 dll。
- C) win32 应用程序 (NON MFC) 从 DLL B 调用函数
当从 DLL B 调用函数时,在调用 DLL A 中的函数以显示对话框时,由于找不到资源而发生错误。
我已经挖掘找到确切的根本原因,主要的原因似乎是模块上下文设置为调用 dll B 而不是包含对话框资源的 DLL A。
在 DllMain 内部,初始化按照 MSDN 中的描述完成:
我发现的一个解决方法是存储从 DLLMain 接收的hInstance参数: extern "C" int APIENTRY DllMain(HINSTANCE hInstance , DWORD dwReason, LPVOID lpReserved) 并在调用函数时在 DLL A 中保存当前句柄并设置新的处理从 DllMain 收到的句柄:
通过使用这个 workarround 它仍然会引起断言,但会显示对话框。
解决这个问题的正常方法应该是什么?
mfc - 我不能在 MFC 中使用 Afx 全局函数
我正在改进一个用 VC++ 编写的应用程序。我想添加一个发送和接收消息的函数。我使用了回调函数。在回调函数中,我用来::AfxGetMainWnd
获取主窗口的句柄。当我输入 ::Afx 时,没有相关的 Afx 出现让我选择。并且AfxGetMainWnd
功能在程序中不起作用。
请帮忙。
c++ - 如何处理 C++ 内联 + 模板上下文中的警告?
我面临一个有趣的问题:我在 Visual C++ 6.0 中有一个 MFC 应用程序项目。由于 MFC 或 C++ 标准中有很多变化,我想将我的应用程序移植到 Visual Studio 2010。这很好,但我现在面临一个警告,我无法处理。
头文件具有以下类定义:
在源文件中有:
当我尝试编译它时,我收到以下警告:
警告 1 警告 C4244:'argument':从 'const long' 转换为 'WORD',可能丢失数据 c:\programme\microsoft visual studio 10.0\vc\atlmfc\include\afxtempl.h 2066
它绝对来自上面提到的“RemoveKey”行:如果我只是简单地注释掉该行,我将不会收到此警告。
我知道,主要问题是,该CTypedPtrMap
对象const long
用作键类型,但CMapWordToPtr
会用WORD
(unsigned short) 代替它。但事实是:我需要 const long 作为键类型,因为我在这个映射中经常处理大约 100 万个数据条目,所以unsigned short
这个类将无法进一步完成它的工作。
我尝试将“RemoveKey”行或包含的嵌套stdafx.h
到以下表达式中,但都不起作用:
请与我分享有关此问题的任何想法,我如何在不更改容器的oElementMap
定义和行为、不在项目设置中全局抑制/禁用此警告以及不更改afxtempl.h
VS2010 提供的文件的情况下解决此警告。
感谢帮助:
安德鲁
api - 如何使用 VBA 中的 API 调用从第 3 方应用程序中的 Afxwnd40 控件获取文本?
我正在尝试编写一个脚本来与第 3 方应用程序中的查找表单进行交互。
该表单有许多文本框,对应于“电话号码”和“客户 ID”等字段,还有一个命令按钮,标题为“查找”。
单击命令按钮时,表单上的多列列表框将填充数据库中与给定条件匹配的任何记录。然后,用户必须双击特定记录,这会打开一个新对话框,其中包含“调整”相关记录的选项。
我没有制作这个表格,也没有直接访问它从中提取的数据库的权限;该表格只允许用户一次调整一条记录。
我希望我的脚本一次复制一个 Excel 工作表中的电话号码列表,将它们粘贴到表单上的正确字段中,单击“查找”按钮,如果列表框中的记录字段之一匹配预定值,打开调整对话框并更改记录。
我已经使用 FindWindow 和 FindWindowEx 来获取我想要将文本粘贴到的字段的句柄,并使用 SendMesage 函数与表单进行交互。
我被困在如何从出现的列表框中读取数据。它不支持复制或粘贴,所以我不能使用 SendMessage 或 SendKeys。使用 WinSpy++,列表框的类是“Afxwnd40”,通过对在线帮助论坛的粗略搜索,它是一个传统控件,它直接“绘制”文本而不能复制它。我听说过一些关于使用“钩子”在数据发送到相关窗口时捕获数据的事情,但我不知道如何设置它。我可以使用的唯一工具是 WinSpy++ 和 VBA 中的任何 Windows API 调用。
visual-studio-2012 - Visual Studio 2012 中的 MFC - 找不到 afx.h 文件
我在 VS 2012 中创建了一个新的静态库项目,并选择了 MFC 选项。它在项目中创建了几个文件,stdafx.h、targetver.h、stdafx.cpp。但是在 stdafx.h 中包含 afx.h、afxwin.h 等,它们被标记为错误。我无法编译开箱即用的解决方案。它说 afx.h 文件未找到。这是什么意思?
mfc - FromHandlePermanent 在注入的 DLL 中总是返回 null
我正在编写一个测试自动化程序,它必须与遗留 MFC 应用程序中的网格控件交互。我的程序必须连接到旧版应用程序,并从网格中读取数据。
我知道包含网格的窗口的 HWND,所以现在我需要找到与该 HWND 关联的 CWnd 派生类指针。CWnd::FromHandlePermanent
似乎是我的朋友,但是是的,我知道,您不能CWnd::FromHandlePermanent
从应用程序外部调用,因为 AFX 窗口映射 ( afxMapHWND()
) 仅包含在目标应用程序中。
因此,我将一个 DLL(使用CreateRemoteThread
/ LoadLibrary
)注入到目标应用程序中,并让它调用FromHandlePermanent
. 但即使这样也不够好,因为我不在HWND的线程中,并且afxMapHWND()
正在查看错误的本地线程存储。
因此,在我注入的 DLL 中,我还(暂时)将 HWND 的 WndProc (SetWindowLong
等)子类化,然后调用SendMessage
. 现在我在正确的线程(目标应用程序的主线程)中,我尝试CWnd::FromHandlePermanent
用我的 HWND 调用,但它返回 NULL!如果我查看afxMapHWND()->m_permanentMap->m_nCount
,我们看到它是 0。因此,permanentMap 中没有附加类,这对我来说似乎是错误的。
那么我怎样才能得到派生的 CWnd 指针呢?
其他一些信息:
- Target 应用程序静态链接到 MFC
- 这是 MFC 的不同版本,windowclass 是 AfxWnd70s
- 我正在使用VS2010编译注入的DLL
- 注入的 DLL 还静态链接到 (VS2010) MFC 库。
这是注入的DLL中的代码:
c++ - 如何创建使用 AFX 库的混合模式 CLR .NET DLL?
我正在尝试使用 CLR 选项创建混合模式(托管和非托管)C++ DLL,并且我需要使用 AFX 库。所以我在一个文件(使用 GL/gl.h)中包含了“afxwin.h”。但是,无论我做什么,我都会遇到编译错误,并且我已经尝试了项目设置中的每个选项来修复它们,但没有用。
A. 当我使用 CLR 选项编译时,我看到了这个错误(当它编译包含 afwin.h 的文件时):
1>c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afx.h(24): 致命错误 C1189: #error : Building MFC application with /MD[d] (CRT dll version)需要 MFC 共享 dll 版本。请#define _AFXDLL 或不要使用 /MD[d]
B. 当我使用在 stdafx.cpp 中定义的 _AFXDLL 进行编译或启用“在共享 DLL 中使用 MFC”以解决 A 中的错误时,我在同一个文件中看到了这些错误和一大堆其他错误:
1> _WIN32_WINNT 未定义。默认为 _WIN32_WINNT_MAXVER(参见 WinSDKVer.h) 1>c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxanimationcontroller.h(46):错误 C2059:语法错误:'-' 1>c :\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxanimationcontroller.h(60): error C2143: syntax error: missing ';' 在 '}' 1>c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxanimationcontroller.h(60) 之前:错误 C2238:在 ';' 之前出现意外令牌 1>c:\program 文件 (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxanimationcontroller.h(61): 错误 C2059: 语法错误: 'public' 1>c:\program files (x86)\microsoft Visual Studio 10.0\vc\atlmfc\include\afxanimationcontroller.h(65):错误 C2059:语法错误:')' 1>c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxanimationcontroller.h(65): error C2589: '-' : '::' 右侧的非法标记 1>c: \program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxanimationcontroller.h(65): error C2059: syntax error: '::' 1>c:\program files (x86)\microsoft visual studio 10.0 \vc\atlmfc\include\afxanimationcontroller.h(67):错误 C2143:语法错误:缺少 ';' 前 '{' \program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxanimationcontroller.h(67): error C2143: syntax error: missing ';' 前 '{' \program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxanimationcontroller.h(67): error C2143: syntax error: missing ';' 前 '{'
有关如何解决此问题的任何想法?我正在使用 VS 2010。
c++ - 消息映射 MFC:继承多个消息映射
我正在使用 MFC100、VS2010、MDI。
我已经摆脱了 CPreviewView 的基本功能。
我希望它的行为与我的 CMyView 非常相似(这是一个 CView)
CMyView 和 CMyPreviewView 不在同一个类继承路径中。
所以我想继承 CPreviewView 消息映射和 CMyView 消息映射。目前,它只继承 CPreviewView 消息映射。
有任何想法吗?我看到了类似的东西
但这仅适用于 ATL。我可以复制并粘贴我的整个 CMyView 消息映射,但是因为有 300 多个处理程序,这真的很混乱。
c++ - CPreviewView 和命令处理程序
我的程序/环境...VS2010、C++、MFC100、CWinAppEx、CMDIFrameWndEx。MFC 功能包。
我正在创建和处理 CPreviewView 衍生产品。我的方法将此预览视图视为用户可以保持并处于活动状态的普通视图。默认 PreviewView 在当前视图上绘制并“接管”子框架。
我不知道的一件事是如何控制应该定向到所有 CDocuments 的 ON_UPDATE_COMMAND_UI 消息映射。创建 CPreviewView 时,它会以某种方式禁用 CDocuments 的所有命令处理程序。CViews 的命令处理程序仍然正常工作。
在我的 MDI 应用程序中打开的所有文档都不会收到其 ON_UPDATE_COMMAND_UI 消息。我可以将这些消息处理程序移到视图或框架中,但有太多无法有效地做到这一点。
有谁知道 CPreviewView 类在哪里关闭文档处理程序?
visual-c++ - 如何将参数传递给afxbeginthread
我正在使用 afxbeginthread 运行一个无模式对话框。我创建了一个从 Cwinthread 派生的新类并重写了 initinstance,如下所示。
在我的主线程中,我正在创建一个用户界面线程,如下所示。
我的问题是:如何将参数传递给 GUI 线程?我想传递一个字符串:我该怎么做?