問題タブ [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)DLLA関数を使用するMFC通常のdll。
- C)DLL Bから関数を呼び出すwin32アプリケーション(非MFC)
DLL Aから関数を呼び出してダイアログを表示するDLLBから関数を呼び出すと、リソースが見つからないためにエラーが発生します。
私は正確な根本原因を見つけるために掘り下げました、そして主な理由はモジュールコンテキストがダイアログリソースを含むDLLAではなく呼び出し元のdllBに設定されているという事実であるようです。
DllMain内では、MSDNで説明されているように初期化が行われます。
私が見つけた回避策の1つは、DLLMainから受け取ったhInstanceパラメーターを格納することでした:extern "C" int APIENTRY DllMain(HINSTANCE hInstance、DWORD dwReason、LPVOID lpReserved) 関数が呼び出されたときにDLL A内に、現在のハンドルを保存して新しいものを設定しますDllMainから受け取ったハンドルを処理します。
この回避策を使用することにより、アサーションが発生しますが、ダイアログが表示されます。
この問題を解決する通常の方法は何でしょうか?
mfc - MFCでAfxグローバル関数を使用できません
VC++で作成されたアプリケーションを改善しています。メッセージを送受信する機能を追加したい。コールバック関数を使用しました。コールバック関数では::AfxGetMainWnd
、メインウィンドウのハンドルを取得するために使用しました。:: Afxと入力すると、関連するAfxappareはありません。またAfxGetMainWnd
、プログラムでは機能が動作しません。
助けてください。
c++ - C++ インライン + テンプレート コンテキストで警告を表示するにはどうすればよいですか?
私は興味深い問題に直面しています: Visual C++ 6.0 で MFC アプリケーション プロジェクトを持っていました。MFC または C++ 標準には多くの変更があるため、アプリケーションを Visual Studio 2010 に移植したいと考えました。
ヘッダー ファイルには、次のクラス定義があります。
ソースファイルには次のものがあります。
これをコンパイルしようとすると、次の警告が表示されます。
警告 1 警告 C4244: '引数': 'const long' から 'WORD' への変換、データが失われる可能性があります c:\programme\microsoft visual studio 10.0\vc\atlmfc\include\afxtempl.h 2066
これは明らかに上記の「RemoveKey」行から来ています。単にその行をコメントアウトすると、この警告は表示されません。
私が知っている主な問題は、そのCTypedPtrMap
オブジェクトがconst long
キータイプとして使用することですが、代わりに (unsigned short) をCMapWordToPtr
持つことです。WORD
しかし、実際には、このマップで定期的に約 100 万のデータ エントリを処理しているため、キー タイプとして const long が必要ですunsigned short
。
「RemoveKey」行またはインクルードをstdafx.h
次の式にネストしようとしましたが、どちらも機能しませんでした。
この問題についてのアイデアを共有してください。コンテナのoElementMap
定義と動作を変更せずにこの警告を解決し、プロジェクト設定でこの警告をグローバルに抑制/無効化したり、afxtempl.h
VS2010 によって提供されるファイルを変更したりせずに、どうすれば解決できますか。
手伝ってくれてありがとう:
アンドリュー
api - VBA で API 呼び出しを使用して、サードパーティ アプリケーションで Afxwnd40 コントロールからテキストを取得するにはどうすればよいですか?
サードパーティ アプリケーションでルックアップ フォームを操作するスクリプトを作成しようとしています。
フォームには、「電話番号」や「顧客 ID」などのフィールドに対応する多数のテキスト ボックスと、「ルックアップ」というタイトルのコマンド ボタンがあります。
コマンド ボタンをクリックすると、フォーム上の複数列のリスト ボックスに、指定された条件に一致するデータベース内のレコードが取り込まれます。次に、ユーザーは特定のレコードをダブルクリックする必要があります。これにより、問題のレコードを「調整」するためのオプションを含む新しいダイアログ ボックスが開きます。
私はこのフォームを作成していません。また、取得元のデータベースに直接アクセスすることもできません。フォームでは、ユーザーは一度に 1 つのレコードのみを調整できます。
スクリプトで、Excel シートから電話番号のリストを 1 つずつコピーし、フォームの正しいフィールドに貼り付けて、[検索] ボタンをクリックし、リストボックス内のレコードのフィールドの 1 つがあらかじめ決められた値と一致する場合は、調整ダイアログを開いてレコードを変更します。
FindWindow と FindWindowEx を使用して、テキストを貼り付けるフィールドのハンドルを取得し、SendMesage 関数を使用してフォームを操作するところまで行きました。
表示されるリストボックスからデータを読み取る方法に行き詰まっています。コピーや貼り付けには対応していないので、SendMessage や SendKeys は使えません。WinSpy++ を使用すると、リストボックスのクラスは "Afxwnd40" です。これは、オンライン ヘルプ フォーラムをざっと検索すると、テキストをコピーせずに直接 "ペイント" する従来のコントロールです。問題のウィンドウに送信されるデータを「フック」を使用してキャプチャすることについていくつか聞いたことがありますが、その設定方法がわかりません。私が自由に使える唯一のツールは、WinSpy++ と VBA での Windows API 呼び出しです。
mfc - FromHandlePermanent は、挿入された DLL で常に null を返します
レガシ MFC アプリケーションのグリッド コントロールと対話する必要があるテスト自動化プログラムを作成しています。私のプログラムはレガシー アプリに接続し、グリッドからデータを読み取る必要があります。
グリッドを含むウィンドウの HWND はわかっているので、その HWND に関連付けられている CWnd 派生クラス ポインターを見つける必要があります。CWnd::FromHandlePermanent
私の友人のようですがCWnd::FromHandlePermanent
、AFX ウィンドウ マップ ( afxMapHWND()
) はターゲット アプリケーションにのみ含まれているため、アプリケーションの外部から呼び出すことはできません。
したがって、ターゲット アプリにDLL を ( CreateRemoteThread
/を使用して) 挿入し、 を呼び出すようにします。しかし、これでも十分ではありません。私は HWND のスレッドに参加しておらず、間違ったローカル スレッド ストレージを見ているからです。LoadLibrary
FromHandlePermanent
afxMapHWND()
したがって、挿入した DLL では、(一時的に) HWND の WndProc (SetWindowLong
など)をサブクラス化し、 SendMessage
. 今、私は正しいスレッド (ターゲット アプリケーションのメイン スレッド)CWnd::FromHandlePermanent
にいて、HWND で呼び出そうとしましたが、NULL が返されました!! を見るとafxMapHWND()->m_permanentMap->m_nCount
、それが 0 であることがわかります。したがって、 permanentMapにはクラスが添付されていません。これは私には間違っているようです。
では、派生した CWnd ポインターを取得するにはどうすればよいでしょうか??
その他の情報:
- ターゲット アプリケーションが 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 : MFC アプリケーションを /MD[d] でビルド中 (CRT dll バージョン) MFC 共有 dll バージョンが必要です。#define _AFXDLL を使用するか、/MD[d] を使用しないでください。
B. A のエラーに対処するために、stdafx.cpp で定義された _AFXDLL を使用してコンパイルするか、「共有 DLL で MFC を使用する」を有効にしてコンパイルすると、同じファイルに次のようなエラーが表示されます。
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): エラー C2143: 構文エラー: ';' がありません '}' の前に 1>c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxanimationcontroller.h(60): エラー C2238: ';' の前に予期しないトークンがあります 1>c:\program files (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): エラー C2589: '-': '::' の右側にある不正なトークン 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(67): エラー C2143: 構文エラー: ';' がありません 前 '{' \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): エラー C2143: 構文エラー: ';' がありません 前 '{'
この問題を解決する方法についてのアイデアはありますか? VS2010を使用しています。
c++ - メッセージ マップ MFC: 複数のメッセージ マップの継承
MFC100、VS2010、MDIを使用しています。
CPreviewView の基本的な機能を削除しています。
私のCMyView(これはCViewです)と非常によく似た動作をさせたいです
CMyView と CMyPreviewView は、同じクラス継承パスにありません。
したがって、CPreviewView メッセージ マップと CMyView メッセージ マップの両方を継承したいと考えています。現在、CPreviewView メッセージ マップのみを継承しています。
何か案は?私は次のようなものを見ました
ただし、これは ATL のみです。CMyView メッセージ マップ全体をコピーして貼り付けることができましたが、300 以上のハンドラーがあるため、これは非常に面倒です。
visual-c++ - afxbeginthread に引数を渡す方法
afxbeginthread を使用してモードレス ダイアログ ボックスを実行しています。Cwinthread から派生した新しいクラスを作成し、以下のように initinstance をオーバーライドしました。
私のメイン スレッドでは、次のようにユーザー インターフェイス スレッドを作成しています。
私の質問は: GUI スレッドに引数を渡すにはどうすればよいですか? 文字列を渡したい: どうすればいいですか?