アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になります

最近、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 にしました
これで良いのですか?

半信半疑で使っています
分かりました教えてください、よろしくお願い致します

A 回答 (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 のそれとは違います。
    • good
    • 0
この回答へのお礼

いつもありがとうございます
なかなか難しいですね

理解するには時間が掛かりそうです
頑張ります
これからもよろしくお願い申し上げます

お礼日時:2022/08/22 12:12

こんにちは


>半信半疑で使っています
理解を深められたいのだと解釈しました
限定的なDeclareステートメントの理解でない方が良いと思いましたので
分かり易いと思う参考サイトをリンクします
https://hatena19.com/use-win-api-with-office-64b …
繰り返し読んで頂くと理解できると思います

個別ステートメントの参考方法はオフィシャルリファレンスサイトで良いと思いますが、サイト内にも提案があります
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます
なかなか難しいですね

理解するには時間が掛かりそうです
頑張ります
これからもよろしくお願い申し上げます

お礼日時:2022/08/22 12:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A