
いつもお世話になります
最近、Win32APIとWin64APIに共有できるようにPtrSafeを使うことにしました
いろいろな説明を見ましたが読解力が無い為、良く理解できずに
全てのDeclare の後にPtrSafeを挿入し、ByVal hwnd As Longと ByVal hWndInsertAfter As Longを
それぞれLongPtrにしています
これど良いのですか?
また、フォーム最大化、最小化ボタンをつける場合のステートメントに使う変数、hWnd
strClassName = "ThunderDFrame" '...ユーザフォームのクラス名を指定
hWnd = FindWindow(strClassName, Me.Caption) '...ウィンドウのハンドルを取得
lngNewLong = GetWindowLong(hWnd, GWL_STYLE) '...ウィンドウに関する情報を取得
rc = SetWindowLong(hWnd, GWL_STYLE, lngNewLong Or WS_THICKFRAME Or WS_MAXIMIZEBOX Or WS_MINIMIZEBOX)
rc = DrawMenuBar(hWnd)
そして、Excel画面を最前面に出すときのステートメントに使う変数、hWnd
hWnd = FindWindow(vbNullString, MyBook & " - Excel")
SetForegroundWindow hWnd '...最前面表示
に対しても
Dim hWnd As LongPtr にしました
これで良いのですか?
半信半疑で使っています
分かりました教えてください、よろしくお願い致します
No.2ベストアンサー
- 回答日時:
こんにちは。
>ByVal hwnd As Longと ByVal hWndInsertAfter As Longを
>それぞれLongPtrにしています
ダメですよ。そんな簡単な話じゃないです。
他にポインター渡ししているパラメータがあれば、それも LongPtr にする必要があります。(ポインターはC言語の知識)
例えば FindWindow WinAPI でも Declare の仕方で変わります。
'■Office 32ビット環境
'◆パターン1
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
'◆パターン2
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As Long, _
ByVal lpWindowName As Long) As Long
↓
'■Office 64ビット環境
'◆パターン1
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
'◆パターン2
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As LongPtr, _
ByVal lpWindowName As LongPtr) As LongPtr
パターン2はクラス名やウインドウ名の文字列をポインターで渡してます。何らかの都合でパターン2で書かれたソースは存在します。
また、ポインターで渡さないとダメな 他 API も存在します。
>全てのDeclare の後にPtrSafeを挿入し
こういった Office 64bit 環境で安全に動作する検証が完了した後、その証として PtrSafe キーワードを付けます。
安全確認済みマーカみたいなものですから、その意図を無視してはいけません。それくらい慎重でないと、OS を巻き込んでクラッシュします。
>Dim hWnd As LongPtr にしました
これはその通り。
LongPtr 型は Office のビット数で次のようにコンパイルされます。
Office 64bit環境→ LongLong型
Office 32bit環境→ Long型
なお、本回答内のビット数は OS のそれとは違います。
いつもありがとうございます
なかなか難しいですね
理解するには時間が掛かりそうです
頑張ります
これからもよろしくお願い申し上げます
No.1
- 回答日時:
こんにちは
>半信半疑で使っています
理解を深められたいのだと解釈しました
限定的なDeclareステートメントの理解でない方が良いと思いましたので
分かり易いと思う参考サイトをリンクします
https://hatena19.com/use-win-api-with-office-64b …
繰り返し読んで頂くと理解できると思います
個別ステートメントの参考方法はオフィシャルリファレンスサイトで良いと思いますが、サイト内にも提案があります
早速のご回答ありがとうございます
なかなか難しいですね
理解するには時間が掛かりそうです
頑張ります
これからもよろしくお願い申し上げます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Excel(エクセル) 【VBA】 Alt+PrintScreenにてアクティブウィンドウのスクショを貼付する方法 4 2022/12/08 20:53
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
このQ&Aを見た人はこんなQ&Aも見ています
-
ハンドル、アドレス、ポインターについて。
Visual Basic(VBA)
-
mscomct2.ocxをパソコンに導入するには?
Excel(エクセル)
-
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
-
4
ユーザーフォームのSetFocusが働かない?
その他(プログラミング・Web制作)
-
5
動かなくなってしまった古いVBAを動くようにしたい
Visual Basic(VBA)
-
6
VBAでFormat がうまく使えない
Excel(エクセル)
-
7
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
8
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
9
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
10
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
11
Accessでブレークポイントを設定してないのに一時停止してしまう
その他(データベース)
-
12
フォームを開くときに、コンボボックスの値を選択(アクセスVBA)
Visual Basic(VBA)
-
13
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
14
VBAのリストボックスをマウスでスクロール
PowerPoint(パワーポイント)
-
15
ExcelVBAでのkernel32(64bit)
Visual Basic(VBA)
-
16
ExcelVBAでListViewが使用できない
Visual Basic(VBA)
-
17
split関数で区切り文字がない場合
Visual Basic(VBA)
-
18
VBA Shapes コピーと名前
Excel(エクセル)
-
19
64ビットエクセルでのAPI宣言/PtrSafe
Excel(エクセル)
-
20
テキストボックスのvalueとtextの違い
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
VBA .Value=.Value ?
-
エクセルで1行目から3行目が消...
-
OutlookでRSSフィードやメモの...
-
ラジオボタンの初期指定
-
スクロールバーについて
-
Alt+P,Alt+NをPostmessageで送...
-
ダイアログでのDragDropでマウ...
-
ゲームでは結局どっちが良いの?
-
EXCEL2016で新しいウィンドウを...
-
これはどういう現象でしょう。
-
常に非アクティブなウィンドウ...
-
VisualC++ サブウインドウの作り方
-
ダイアログをスクロールさせるには
-
隠れたウィンドウの画面をキャ...
-
c言語win32apiで孫ウインドウか...
-
VBAで単一ブック複数窓を閉じる...
-
他アプリのアクティブな子ウイ...
-
勝手にウィンドウが開いて止ま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
Vba LongPtrについて教えてくだ...
-
勝手にウィンドウが開いて止ま...
-
ラジオボタンの初期指定
-
ゲームでは結局どっちが良いの?
-
検索の画面がでなくなってしま...
-
Excelの上下を固定したい
-
「&HFFFF」「&H1A」とは?
-
ExcelのBOOKが消えた!
-
エクセルで1行目から3行目が消...
-
[VBA] UserForm を Excel の W...
-
【VB2008】 マウス操作の一時的...
-
VBA .Value=.Value ?
-
作成したウインドウのサイズを...
-
DellノートPC購入で悩んでいま...
-
UWSCで特定のChromeのタブをア...
-
Alt+P,Alt+NをPostmessageで送...
-
隠れたウィンドウの画面をキャ...
-
Console.WriteLine で表示されない
おすすめ情報