Excel VBAからDLLを呼び出す時、Debugビルドだと実行時エラーになる
code:ㅤ
実行時エラー '53'
ファイルが見つかりません: DLLのパス\sampleDll.dll
Releaseでビルドして同じパスにDLLを上書きすると正しく呼び出せるので、ファイルは見つかっていると思うんだけど…
実行時エラー 53
File not foundらしく、ファイルが見つかっていないのでは? という記事が多くヒットする
ダイナミックリンクライブラリ(DLL)内のプロシージャの呼び出しが試みられましたが、\*\*Declare\*\*ステートメントの\*\*Lib\*\*句に指定されたライブラリまたはリソースファイル名が見つかりません。 DLLプロジェクトのプロパティ
構成プロパティ > C/C++ > コード生成 > ランタイムライブラリ
_DEBUG、_MT、および_DLLを定義します。アプリケーションで、マルチスレッド対応バージョンおよびDLL対応バージョンのランタイムライブラリが使用されます。また、コンパイラによって、ライブラリ名MSVCRTD.libが.objファイルに挿入されます。 アプリケーションでランタイムライブラリのマルチスレッド対応およびDLL対応バージョンが使用されます。_MTおよび_DLLを定義し、コンパイラにライブラリ名MSVCRT.libを.objファイルに挿入させます。 このオプションを使用してコンパイルされたアプリケーションは、MSVCRT.libに静的にリンクされます。このライブラリには、リンカーが外部参照を解決できるようにするコードレイヤーが用意されています。実際の作業コードは、MSVCRversionnumberに含まれています。DLL。実行時に、MSVCRT.DLLにリンクされているアプリケーションに対して使用可能である必要があります。 この違いでVBAからの呼び出し結果が変わる
なんで
回答者がエスパー回答しているのが今回の回答っぽい(なんでかが知りたい)
なお、質問者の原因は違うようだった
ソリューションエクスプローラーのプロジェクト上で右クリック → プロパティ でプロジェクトのプロパティを開き、構成プロパティ-C/C++-コード生成 の "ランタイム ライブラリ" の値を確認してください。たぶん、"マルチスレッドデバッグDLL (/MDd)" になっていると思います。 参考
単純に実行環境にMSVCRTDがないから?
https://gyazo.com/5637ac53219ccb1c4e904893a2e7629c
code:mmd
flowchart LR
vba
end
vba -- call_OK --> 64
vba -- call_NG --> 32
end
code:ㅤ
cサブルーチン -- arrow --o d(円筒) -. doted .- m(((二重丸))) e((円)) -. doted arrow .-x f>フラグ]
g{ひし形} == thick ==> h{{ヘクス}}
%% ~~~ invisible
コード最適化オフ
組み込み関数を使用しない
関数レベルでリンクしない
ランタイムライブラリをデバッグ用に変更
code:vb
Private Declare PtrSafe Sub DoNothing Lib "DLLのパス\sampleDll.dll" (ByVal l As Long)
Private Sub UserForm_Click()
On Error GoTo Catch
Call DoNothing(1)
Catch:
Debug.Print (Err.Description)
Debug.Print (Err.HelpContext)
Debug.Print (Err.HelpFile)
Debug.Print (Err.LastDllError)
Debug.Print (Err.Number)
Debug.Print (Err.Source)
End Sub
code:err
ファイルが見つかりません: DLLのパス\sampleDll.dll
1000053
C:\Program Files\Common Files\Microsoft Shared\VBA\VBA7.1\1041\VbLR6.chm
183
53
VBAProject
code:ㅤ
/permissive- /Yu"stdafx.h" /GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"rererere\vc141.pdb" /Zc:inline /fp:precise /D "WIN32" /D "NDEBUG" /D "DLL2_EXPORTS" /D "_WINDOWS" /D "_USRDLL" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /FC /Fa"rererere\" /EHsc /nologo /Fo"rererere\" /Fp"rererere\Dll2.pch" /diagnostics:classic
code:ㅤ
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー D8016 コマンド ライン オプション '/O2' と '/RTC1' は同時に指定できません Dll2 C:\開発\お試し\Dll2\Dll2\cl 1
code:ㅤ
WIN32;_DEBUG;DLL2_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
WIN32;NDEBUG;DLL2_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)