LoginSignup
19
25

More than 1 year has passed since last update.

VBAでWinAPI32を使うためのリンク集

Last updated at Posted at 2018-09-06

重要 2018/09/24よりOfficeは64bitでインストールされます

https://it.srad.jp/story/18/09/28/0614240/
このため、そのままインストールしてすると従前は32Bitでしたが、この日以降は64Bitになります。これはOffice2016でもクリーンインストールすれば発生します。Windows Storeでも同様です。インストールした場合は一度アンインストールする必要があります。同居はできません。
また64bit版にはなんのメリットもなく、デメリット以外存在しません。MSが64bitに乗り遅れたくないということだけです。ユーザーには1円も1分も全く意味やメリット、恩恵はありません。MSやITメディアが記述する64Bitのメリットなど全く関係がありません。高速化もしません。逆に使えないDLLがでてきて、しかもそのDLLに対してマイクロソフトはなんの対策も取っておらずサードパーティもなにもありません。そうしたことをマイクロソフトは全く説明しておらず、極めて悪質であると言わざるを得ません。また、すべてのITに関するメディアも信用ができないです。このため必ず32Bitにしてください。だまされて64Bitにして「〇〇が動かない」といったときのQAサイトの「だまされたお前が悪い。」「大体のDLL、そんなもんねーよ。使うお前が悪いんだ」みたいに罵倒され嘲笑されるだけです。こんなくやしくお金も時間もかかる後悔をするよりまず32Bitにしましょう。
Win32APIに関してはデメリットははっきりしています。

64Bit化がだめな理由 DeclareがDeclare PTRSAFE が必要で全部エラーになる

このため、すべてのDeclareに Declare PtrSafe をつけないと全く動きません。すべて必ずエラーになります。例外はありません。
これをすべての宣言で行わなければいけません。ですが、それでもほぼすべて動かないのです。

64Bit化がだめな理由PointerがLongPtrになる。これがDim Typeまで及ぶ

ポインターを表すLongをLongPtrに変える必要がありますが、このような記述は肝心なことが抜けています。これにともないTypeステートメント(構造体/Constractor)及びConstにも変更するものがあります。Dimステートメントもそうです。Declare部分だけではなく、Subプロシージャでもあり得ます。このためConstディレクティブ IFディレクティブを使用し、複雑で長くなります。この変更はいまのところ確定した技術がすべてネットで検索できるわけでもなく、マイクロソフトが公式に情報を提供しているわけでもありません。Win64bit APIの情報はC++やVBを前提としており、VBAはほとんどありません。2005年のITメディアは移行は簡単と書いていますが、VBAに関してはあてはまりません。

64bit化対応のモジュール(2020/11/23追加)

VBA APIコール sodocumentation.net
モジュールとしてすべて集めている模様。
ただし、関数名にすべてapiが追加されているが、通常はapiは付けない。

年代別

WinApi32は2000で用いられてその後失速するのがわかるけど、重要なことは2000年に集中している

1996

win32 サブルーチンズArchive
常岡伸二氏のページC言語前提だがWidnows95初期のAPIについて

1999

Welcome to MASAPICO'S Page
CとVBを比較して載せてある。2003年までしか更新がないが、ここに乗っている比較はロゼッタストーンに匹敵する。VBだがVBAにも変換は可能。

2000 WinApi 32

Microsoft Office (全般) >コラム > Office Talk Office VBA と Windows AP 日本語版最終更新日 2001年4月26日
###Microsoft Office 2000/Visual Basic プログラマーズ ガイド

第 2 部 Office ソリューションの開発

第 10 章 Windows API とその他のダイナミック リンク ライブラリの項目一覧

Windows 2000 >グラフィックおよびマルチメディア > GDI Windows GDI
ユーザー定義型を渡す

Microsoft Office 2000/Visual Basic プログラマーズ ガイド
Declare ステートメントの構造
Windows 開発 >Windows 2000 > ユーザー インターフェイス デザインおよび開発

Windows 開発 >Windows 2000 > グラフィックおよびマルチメディア > GDI >Windows GDI

Windows 開発 >Windows 2000 > グラフィックおよびマルチメディア > Image Color Management (ICM) > 色の管理

Windows 開発 >Windows 2000 > グラフィックおよびマルチメディア >Windows マルチメディア > リファレンス > Windows マルチメディア 関数一覧

Windows API について
アーカイブコンテンツ
ここで提供しているコンテンツは提供時のままであり、現在でも技術的に正確であるという保証はありません。当時は有効であった URL が、現在では存在しないサイトやページにリンクしているかもしれないことに注意してください。

2005

時代に遅れないためのWin64用アプリケーション開発 (2/3) 2005年06月15日 00時00分 ITMedia EnterPrise
Windows API
 64ビットWindows環境でも、大部分のWindows APIはWin32から変更なしで利用することができます。ただし、いくつかのAPIは拡張されたデータ型を使用するために引数の型が変更されました。
 また、64ビット引数を2つの引数に分割するなど、APIそのものが変更されたものもあります。そして、Windowとクラスに関するポリモーフィック(〜Ptr)なAPIも追加されています。
時代に遅れないためのWin64用アプリケーション開発 (3/3) 2005年06月15日 00時00分 ITMedia EnterPrise

  • ポインタをint、long、ULONG、DWORDなどにキャストしてはならない
  • ポインタの型変換には、PtrToLongやPtrToUlong関数を使うこと
  • Win64はLLP64のプログラミングデータモデルなので、引数によってポインタを得るような関数には注意する
  • ポリモーフィックAPIに注意する
  • 新しいWindowクラス関数および定義を使う
  • size_t、HANDLE、LPARAM、WPARAM、LRESULTなど派生タイプのデータ型はプラットホームによってサイズが変わることに注意

Windows API 32 のサンプル - NonSoft
32Bit Apiのみ
Windows API:VB6・VBAでの宣言一覧(A) フィロの村 Note
NONSoftのページと同じく網羅系
32 APIのみ

MOUG 即効テクニック > AccessVBA > Windows環境・オブジェクト
この中に実はWinAPIサンプルがあるが、32Bit版のまま

2006

The Windows API and Other Dynamic-Link Libraries | Microsoft Docs

Microsoft® Visual Basic® for Applications (VBA) の最も強力な機能の 1 つは、その拡張性です。 Microsoft® Windows® アプリケーション プログラミング インターフェイス (API) およびその他のダイナミック リンク ライブラリ (DLL) で関数を呼び出すことにより、アプリケーションを拡張できます。 VBA プログラマーは、Windows API のほとんどの関数を使用できることに気付くでしょう。つまり、アプリケーションを制御できるだけでなく、オペレーティング システムの大部分を制御できる可能性があります。さらに、VBA を使用して DLL 関数を呼び出す方法を習得すると、ほぼすべての DLL で関数を呼び出すことができるため、通常は C および C++ プログラマーのドメインであるテクノロジを活用できます。

2006/9/14に発表された記事、ここから3つのセクションに分かれる。
API Basics | Microsoft Docs
Wrapping DLL Functions | Microsoft Docs
Calling DLL Functions | Microsoft Docs

API Basics | Microsoft Docs

Microsoft® Windows® API の目的は、Windows オペレーティング システムおよびユーザー インターフェイスと一貫性のあるプログラムを開発できるようにすることです。フォーム、コマンド ボタン、メニューなどの Windows オペレーティング システムのコンポーネントを作成するコードを個別に作成する代わりに、Windows API で適切な関数を呼び出して、オペレーティング システムにそれらのコンポーネントを作成させることができます。 Windows API は関数の複雑なセットであるため、このドキュメントは開始点を提供し、詳細を知る必要がある場合は他のリソースに案内します。 Windows API の呼び出しで学んだスキルは、他の DLL の DLL 関数の呼び出しにも適用できます。

:ping_pong: Anatomy of a Declare Statement

Unicode バージョンには "W" サフィックスがあります。 VBA は内部で Unicode を使用しますが、DLL 内の関数を呼び出す前にすべての文字列を ANSI 文字列に変換するため、通常、VBA から Windows API 関数を呼び出すときは ANSI バージョンを使用します。

Wrapping DLL Functions | Microsoft Docs

DLL 関数の呼び出しは、多くの点で Microsoft® Visual Basic® for Applications (VBA) 関数の呼び出しに似ていますが、最初は DLL 関数を混乱させるような違いがあります。このセクションでは、DLL 関数での引数の型指定とプレフィックスの付け方、文字列を返す方法、データ構造を渡す方法、期待できる戻り値、およびエラー情報を取得する方法について説明します。

Calling DLL Functions

DLL 関数を頻繁に呼び出す場合は、これらの関数をクラス モジュール内にカプセル化してプロセスを簡素化することができます。 1 つまたは複数の DLL 関数を呼び出すプロパティまたはメソッドを作成することにより、Microsoft® Visual Basic® for Application (VBA) の典型的なオブジェクト指向の方法で DLL 関数を操作できます。さらに、DLL 関数の宣言と呼び出しは困難でエラーが発生しやすいため、DLL 関数の呼び出しを再利用可能なオブジェクトにパッケージ化すると、API を呼び出すたびにこの操作を繰り返す必要がなくなります。

Office 2010 VBA7 Win64

2010

Declaring API functions in 64 bit Office
Windows API Code Pack連載 第1回〜第10回の一覧
※ 特に記載がない限り、開発ツールはVisual Studio 2010、開発言語はC#を使用して説明しています。
Visual Basicのコードが必要な方は、以下のサイトにあるWindows API Code Packのセッションの資料をダウンロードしていただければ、スライドの後半にVBのコードを掲載していますので、ご参照いただけます。
Office 2010 Help Files: Win32API_PtrSafe with 64-bit Support
Windows API Declarations and Constants for Visual Basic (Updated for the 64-bit version of Microsoft Office 2010) provides declarations for Microsoft Visual Basic programmers who want to call Windows API routines. This file is updated to include calls to the 64-bit version of Microsoft Office 2010.
Version:0410
File Name: Office2010Win32API_PtrSafe.exe
Date Published: 4/28/2010
File Size: 688 KB
Versions of MicrosoftR Office and Microsoft Visual BasicR for Applications (VBA) prior to Microsoft Office 2010 and Visual Basic for Applications 7.0 (VBA 7) included the file, Win32API.txt, which facilitated making calls to the Microsoft Windows API. With the addition of 64-bit support in Microsoft Office 2010, an update to this file is needed to support 64-bit API calls. Win32API_PtrSafe.txt is a new version of Win32API.txt that supports API calls on both 32-bit and 64-bit versions of Windows.
Win32API_PtrSafe.txt contains the following:
?32-bit (x86) and 64-bit (x64) compatible Declare statements for the Windows API functions that were included in the original Win32API.txt file.
?Global constant declarations for the constants that the provided Declare statements use.
?Type declarations for the user-defined types (structures) that the provided Declare statements use.
Microsoft API and reference catalog
英語版
Microsoft Office Code Compatibility Inspector ユーザー ガイド
VBA から VBA 7(VBA7) に- VBA7で何が出来るのか?
Office VBA リファレンス VBA 言語リファレンス > 64 ビット Visual Basic for Applications の概要
64bit Windows時代到来:第2回 Win32アプリケーションを実行するWOW64 (1/2)

16bitアプリケーション(Win16アプリケーション)を呼び出すことはできない。Win32やWin64 APIで利用されるハンドル情報は16bit幅には格納できないので、16bitアプリケーションに渡したり、結果を受け取ったりできない。そのため、WOW64ではWin16アプリケーションを実行できない。
 ただし、64bit CPUにしたからといって、32bit CPUの2倍速くなるといったことはまずない。せいぜい1割から2割高速化する程度である。ほかにもいくつかベンチマークなどを実行してみたが、そもそもクライアント用途向けでは32bit OSでも十分なプログラムやアプリケーションが多く、64bit OSでなければ実行できないといったプログラムはほとんどない。となると、現状ではやはりオーバー4Gbytesのメモリが利用できる、という点が64bit Windowsの一番のメリットといえるだろう。なおサーバ用途ではすでに64bit専用アプリケーションがいくつか登場しているし、大容量のメモリを要求する処理も少なくないので、サーバ環境では64bitシステムの優位性が揺らぐことはないだろう。

2011

Windows API リスト 更新日: 2011 年 6 月 1 日
VBAから64bit の Windows API を使う場合の情報置き場
VBA-APIコール VBA Tutorial
Office 2010のころ。かなりまとまっている。64/32についても記述がある。(2020/09/16追加)

2013

Any 型?
Visual Basic 6 では、データの型としてAny 型がありました。

これは普段 Declare 宣言の API 使用時に String 型で値を渡す変数に対し、ブランク文字(“”)ではなく、Null 値が収納されたアドレスをセットした際に、Null ポインタ(Long 型)を String 型に代入すると型の不一致でエラーが発生します。個人的には String 型に例外で Null がセットできればよいと考えますが、DLL 側で起こるエラーでもあり、うまいことエラーを処理できないことがあります。スマートに対処するには都合よく変数を扱える変数があればよいと考案されたと思われるデータ型です。毎回 Byte 型で渡せばよいのではとも思いますが、これも文字コードやらなんやらの問題を引き起こすので Visual Basic たるもの、やはり簡潔に表現するための型が作られたと思います。

Visual Basic .Net の変換ツールで移行すると、Any 型は過去のものなのでなにかに置き換えなさいと言われます。これにうまいこと対処するには Any 型が現れる前の概念を復古させればよいと思います。

Visual Basic の Declare 宣言部は DLL を指定し、基の関数名とエイリアスを指定して、どんな変数、型を使用するかを指定します。

たとえば、メッセージフックで使用する API でも、lParam で文字列か Null ポインタを扱う Any 型を使用していました。
Public Declare Function CallNextHookEx Lib “user32” (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As Any) As Integer

これを Visual Basic .Net に移行する際は、文字列を渡す API と Null を渡す API に分けてエイリアスを宣言すれば解決です。

Public Declare Function CallNextHookEx Lib user32 (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As String) As Integer
Public Declare Function CallNextHookExNull Lib user32 (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As Long) As Integer

2015

Docs .NET Visual Basic のガイド COM 相互運用 チュートリアル: Windows API の呼び出し (Visual Basic)2015/07/20

  • [方法: Windows API (Visual Basic) を呼び出す](https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/com-interop/how-to-call-windows-apis)
  • [方法: 符号なしの型 (Visual Basic) を取得する Windows 関数を呼び出す] (https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/com-interop/how-to-call-a-windows-function-that-takes-unsigned-types)
    • クラス、モジュール、または符号なし整数型のメンバーを含む構造体を使用する場合は、Visual Basic でのこれらのメンバーを表示できます。

Office 2010 の 32 ビット バージョンと 64 ビット バージョンとの互換性:最終更新日: 2015年4月24日

2016

入手可能な Windows SDK について Winows 8 / 8.1 / 10 向け

2017

API Chips & Others Last Update:2017/10/15
Windows アプリ > API リファレンス
Windows アプリ > 開発 ユニバーサル Windows アプリのリファレンス
VBA から VBA 7(VBA7) に- VBA7で何が出来るのか?
【エクセルVBA】Windows APIで外部プログラムを呼び出すための第一歩 いつも隣にITのお仕事
【エクセルVBA】 URLDownloadToFile関数を使って指定ファイルをワンクリックでダウンロードする方法 いつも隣にITのお仕事
いきなりURLDownloadToFileに飛ぶ2回シリーズ

2018

Docs/Windows/Desktop/API Index/Windows API ListWindows API Index Last Update:05/31/2018
Access VBA >プリンターの機能をプログラムで取得します。
API 技術関連情報 http://madia.world.coocan.jp/
掲載当時で6年前のデータが変数の解説、サンプルが充実
目的別 Win32API のサンプル集プログラミングのメモ帳(C/C++/HSP)
このページ自体はVBAではないのだが、この一覧表がWin32APIで何ができるのか、ジャンルごとに分けられている。
VBAでWin32APIを使う方法と定義一式 Excel作業をVBAで効率化
時間に関するTime構造体(Type Statement)と配置の順番の考え方。
Declareの前に置く。
またここでも大文字、小文字は正確に区別して記述する。
VBAでWindowsAPIを使うには @nukie_53 Qiita 2018年08月13日に更新
VBAでWin32Apiを使うための基本を解説した記事。
basUtf8FromString 2018-08-17
WideCharToMultiByte、MultiByteToWideCharを使用した例。64bit化済
UTF-8への文字列の変換、Byte数などそのままモジュールとなっている。
しかし

Public Sub Test_Utf8String()
    Dim b() As Byte
    Dim s As String
    
    b = Utf8BytesFromString("áéíóñ")
    s = Utf8BytesToString(b)
    Debug.Print "[" & s & "]"
End Sub

このテストはの文字列自体がVBEで書けないので áéíóñ をA2というセルに入れる。MessageboxEx関数でMessageBoxに表示させるとして、
if pFrom or pTo are unqualified names the current directories are taken from the global current drive/directory settings managed by Get/SetCurrentDrive/Directory the global confirmation settings

' QUICK TEST
' For Excel Need Windows API
Public Sub Test_Utf8String()
    Dim b() As Byte
    Dim s As String
    
    b = Utf8BytesFromString([A2]) 'セルから文字列を取得
    s = Utf8BytesToString(b)
    Call MsgBoxEx("[" & s & "]") 'Debug.Printでは写らないので、MessageBoxExを使う
End Sub

2つのAPIの各パラメータの役割及び定数はこちら。
http://chokuto.ifdef.jp/urawaza/api/MultiByteToWideChar.html
http://chokuto.ifdef.jp/urawaza/api/WideCharToMultiByte.html
WideCharToMultiByteとMultiByteToWideCharによる文字コード変換のサンプル(VB6)
実はこのVB6はそのままVBAになる。ポイントはAPIの定義の仕方。2007のため32bit仕様であり、上記サイト等から持ってくる必要がある。
VBAでWin32APIを使う方法と定義一式
2018/09/24
Win32 API ( 64 bit 対応なし)のまとめ

2020

2020/08/11 第123回.APIについて(Win32API)EXCELの真髄
ここからVBAでWEBカメラ操作する
などのWindow操作、ExcelのセルのサイズをDPIで取得する方法など。PtrSafeのついたサンプルとなっている。

2021

Windows Sampleリボンの君とSuyamaSoft
Excel VBA Sample
WindowsAPI
C、C++の型とデータータイプ
このサンプル集にはWindowsAPIを使ったものが多数ある。更にUIまで操作している。
またこの項目はSampleだけではなくWindowsAPIをVBAで使うコツがある。
チュートリアル: Windows API の呼び出し (Visual Basic)
VBAに関するのは、Declare を使用した API 呼び出しの項目
アンマネージ DLL 関数の処理
Windows SDK とエミュレーターのアーカイブ
:ping_pong: 64ビット環境で実行する VBA マクロでは、戻り値の型を明示的に宣言する必要があります。

2022

Office の 32 ビット バージョンと 64 ビット バージョン間の互換性
Office 2010 の 32 ビット バージョンと 64 ビット バージョンとの互換性と同内容だが

概要 : 2GB 以上のデータを扱っているユーザーのために、Microsoft Office 2010 の 64 ビット バージョンが提供されるようになりました。この記事では、32 ビット バージョンと新しい 64 ビット バージョンとの互換性に関する問題、および以前の 32 ビット Office アプリケーションとそのソリューションについて説明します (7 ページ)。

32 ビット バージョンの Office と 64 ビット バージョンの Office の互換性についてご確認ください。
Office アプリケーションは、32 ビット バージョンと 64 ビット バージョンでご利用いただけます

冒頭からしてやる気の感じられない展開となっている。
さらに、ダウンロードファイルのURLが違っている。現在はこちら。

なお、このファイルはC:\Office 2010 Developer Resources\Documents\Office2010Win32API_PtrSafeに展開される。

#ソフトウェア(アプリケーション)別

PHP

VBからでも呼び出せるので、VBS Jscript Powershellについて以下簡記する
PHPでWin32APIを呼ぶ(Windows) @joh Qiita

  • DynamicWrapper をインストールする
  • php.ini で php_com_dotnet.dll を有効化する
  • サンプル・コード
  • 参考

Dynamic Wrapper

下記のVBSとリンク先が異なっている
Écrit par Gilles LAURENT
27-06-2008
http://glsft.free.fr/index.php?option=content&task=view&id=47

SFC Mini

最新版は2015年
Vectorは古いようだ
http://sfcmini.osdn.jp/help/
SFC mini (ver 1.1)

https://www.vector.co.jp/soft/winnt/prog/se387565.html
VBScript/JScriptでWin32API・構造体・コールバック関数・ウィンドウプロシージャを扱う
https://ja.osdn.net/projects/sfcmini/
最新リリース
sfcmini ver 1.1.0 (日付: 2015-05-12)
suppon ver 0.1.1 (日付: 2015-05-12)
suppon 0.1.0_beta (日付: 2008-07-26)
oyagame 0.1.0_beta (日付: 2008-06-02)
sfcmini 1.0.5_beta (日付: 2008-04-25)

VBS

VBA の機能で VBScript に含まれていない機能
Declare ステートメント (DLL 参照のための宣言)
キーワード Optional
キーワード ParamArray
Static ステートメント
条件分岐
#Const ディレクティブ
#If...Then...#Else ディレクティブ
オブジェクト
Clipboard オブジェクト
Collection オブジェクト
VBSでuser32.dll(Win32API)を使用する方法を教えてください。
できません。
(中略)
 (上記の)項目にありますとおり、Declare ステートメントがサポートされていない
ためです。
  [SFC mini]
  http://kandk.cafe.coocan.jp/sfcmini/catid-19.html
または、
  [Dynacall] DynWrap.DLL ダウンロードページ(En)
  (リンク切れ上記Frのページを参照)
  [Dynacall] サンプル(リンク切れ発掘 https://qiita.com/Q11Q/items/616fe24a1fe83acdf1c2 )
などの Dll をインストールして、そこを経由することになります。
私見ですが、新たなインストールを避けたい場合や面倒に感じるので
あれば Excel VBA を使った方が良いと思います

WMI Sample - WMI Fun!

ただしVBScript Powershell (おそらくサンプルはないがJscriptも)WMIを使うとかなりのことができる。

Dim wmiLocator
Set wmiLocator = CreateObject("WbemScripting.SWbemLocator")

####さらにWMIはVBAの場合は参照設定可能
Microsoft WMI Scripting VX.X Libraryに参照設定する

Excel4Macro Process

VBScriptでProcessIDからHWNDを取得する。 @nezuq Qiita

###クリップボードはIEかPowershellを使う
クリップボードのテキストを取り出して、VBScriptで扱う @int_main_void Qiita
Hey, Scripting Guy! クリップボードから URL を取得し、その Web サイトをブラウザで開く方法はありますか

Jscript(Excel4Macoを使う方法しかない)

Win32 API(JScript) CX's Hello, World! 2012/4/21
Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
JScript には Win32 API を直接呼び出す機能は存在しないが、他のコンポーネントを経由することで、呼び出すことが可能である。
Win32 API を呼び出すことが可能なコンポーネントとしては「DynamicWrapper」「SFC mini」「Excel」等がある。
以下は DynamicWrapper を経由した Win32 API 呼出し例である。(後略)
2021/11/03追記:ただしExcel4Mcroはデフォルトでは動かないようになる。

Powershell

powershellでWin32 APIを利用する(powershell 2.0以上)
PowerShellで演奏する電子オルゴール @gx3n-inue Qiita
##Microsoft Access
Office BAリファレンス >Access VBA > 概念> Windows API > 情報をクリップボードに送信する
Office BAリファレンス >Access VBA > 概念> Windows API > クリップボードから情報を取得(retrieve)する
Office BAリファレンス >Access VBA > 概念> Windows API > シェル プロセスの終了日時を調べる
Office BAリファレンス >Access VBA > 概念> Windows API > ネットワークにログオンしたユーザーの名前を取得する
ただし公式のくせに64bitなし。公式からも無視される。

機能別

iniファイルF

iniファイル操作関数
http://addinbox.sakura.ne.jp/Excel_Tips16.htm

VBA から VBA 7(VBA7) に

http://vivavba7.web.fc2.com/vba7.html
As Any
OVERLAPPED
について説明あり。

As Any , Alias 指定

As Any 指定とは対象がなんでも良いという事です。
例えば readFile Lib "kernel32" Alias "ReadFile" は As Any を As Byte としても問題ないです、

Declare PtrSafe Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As LongPtr, ByRef lpBuffer As Any, ```

の ByRef lpBuffer As Any 指定は ByRef lpBuffer As Byte でもOKです。

Declare PtrSafe Function ReadFile Lib "kernel32" (ByVal hFile As Integer, ByRef lpBuffer As Byte, ・・・


### OVERLAPPED
>引数の最後の lpOverlapped As OVERLAPPED も lpOverlapped As Integer でも同じです、この時は lpOverlapped で受け取ったアドレスを OVERLAPPED に入れ替える必要が有ります。


>```vb
Declare PtrSafe Function readFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As LongPtr, ByRef lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long
Declare PtrSafe Function ReadFile Lib "kernel32" (ByVal hFile As Integer, ByRef lpBuffer As Byte, ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, ByVal lpOverlapped As Integer) As Long

実行時エラー453

指定された DLL 関数が見つかりません (エラー 453)

  • 関数宣言で無効な序数を指定しました。適切な序数を確認するか、名前によって関数を呼び出してください。
    
  • 正しい DLL 名を指定しましたが、指定した関数が含まれるバージョンではありません。コンピューター上に正しいバージョンがある可能性はありますが、誤ったバージョンが含まれるディレクトリが、正しいバージョンが含まれるディレクトリよりも前にあると、誤った DLL がアクセスされます。コンピューターに複数のバージョンがないかどうかを確認してください。前のバージョンがある場合は、サプライヤーに連絡して、新しいバージョンがないかどうかを確認してください。
  • 32 ビットの Microsoft Windows プラットフォームで作業している場合は、DLL 名とエイリアス (使用されている場合) の両方が正しくなければなりません。DLL 名とエイリアスが正しいかどうかを確認してください。
  • 一部の 32 ビット DLL には、 Unicode と ANSI 文字列の両方に対応するように、少しだけ異なるさまざまなバージョンの関数が含まれています。名前の末尾に "A" が付いている関数は ANSI バージョンを、名前の末尾に "W" が付いている関数は Unicode バージョンを指定します。
  • 関数が文字列型の引数を取る場合は、"A" を関数名に追加してみてください。

GetCurrentDirecotryが関数名にAを追加する

公式の資料では

Declare PtrSafe Function GetCurrentDirectory Lib "kernel32" ( _ 
        ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

これでは上記エラーが起きる

Private Declare PtrSafe Function GetCurrentDirectory Lib "kernel32" _ 
       Alias "GetCurrentDirectoryA" ( _ 
       ByVal nBufferLength As Long, _ 
       ByVal lpBuffer As String) As Long
http://madia.world.coocan.jp/vb/API/GetCurrentDirectory.htm
Private Sub Sampe()
  Dim nName As String, nLeng As Long, Ret As Long
  'バッファを確保
  nName = String(250, Chr(0))
  nLeng = Len(nName)
  Ret = GetCurrentDirectory(nLeng, nName)
  Debug.Print nName
End Sub

文字コード 変換

VBAからUnicode版のWindows API を使う 2008/01/31 14:00 Codezine
VBAで Windows APIを使った UTF-8 ←→Unicode相互変換 @yamashiroakihito - Qiita 2018/5/30

Sound

懐かしすぎて憤死するWIN32API(古の趣味ゲーム開発編) @calcs Qiita
QueryPerformanceTimer Sleep Sound 関係はゲームによく用いられていた。
サウンドを再生する OfficeTanaka

Timer

64ビット環境で実行する VBA マクロでは、戻り値の型を明示的に宣言する必要があります。
タイトルと異なり、実はタイマーのことが書いてある。

クリップボード

VBA クリップボードの値を取得する方法(API) 64Bit対応版 – Excel -Sakakibara Engneearing
Share the Clipboard with VBA and the Windows API-Francesco Foti’s weblog

Color RGB ICM

Image Color Management (ICM) 色の管理 ICM 2.0 > ICM 2.0 API 一覧

XlRgbColor 列挙 (Excel)
VBA クラスモジュールを使って色見本(カラーパレット)を作る t-hom’s diary Hateblo 201/2/26
[RGB to RYB & CMYK Conversion ]

書籍

大村あつしのExcel VBA Win64/32 APIプログラミング

行方不明になったもの

Office 2000のころにあった API Viewer

WinAPI ビューア アプリケーションを使用する

Win32Api.txt

ネットにそれらしきものはあるが同一性があるか不明だ。 https://hwiegman.home.xs4all.nl/downloads/Win32API.Txt
※利用は自己責任でお願いします

#Other Class Module
ClassModule化しないとコードの上が重い。このためにはClassModuleにするのがどうも有効なようだ。

VBA クラスモジュール 超 入門 t-hom's Diary
VBAでクラスをつくる @Kamo123 - Qiita 2017/12/16

注 :Surfaceは致命的は現時点ではデスクトップ版がインストールできない

Surface Laptop の場合は、Windows 10S OS 自体がストア アプリのみの動作を許可する仕組みとなるため、デスクトップ アプリ版 Office 2016 をインストールすることはできません。

今回の投稿は以上です。

本情報の内容 (添付文書、リンク先などを含む) は、作成日時点でのものであり、予告なく変更される場合があります。

Tags Office クライアント開発 ストア版Office

以下私見

つまりWIN32APIを使用している場合、バグが発生する可能性がある。特に環境変数が読めないのはおどろき

Office の COM オブジェクトに関するセキュリティ設定

19
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
25