• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:vc++のAPI(dll)の引数をVBAでうけとる)

VBAでvc++のAPI(dll)の引数を受け取る方法

このQ&Aのポイント
  • Excelで開発する際に、vc++のAPIが持っている関数をExcelVBAでコールしてエラー1041が発生しています。VBAからVisual C++にchar*型で渡し、ByRef String型でVBAにて受け取る方法について教えてください。
  • VBAではcharに相当する変数型がないため、VCの関数の第四引数「char* 型/attribute_value」をVBAの「String 型/sValue」で受け取る際にエラーが発生しています。char*型をString型として受け取る方法について教えてください。
  • VBAからvc++のAPIを利用する際には、char*型の引数をString型で受け取る必要があります。具体的な変換方法や注意点などを教えていただけますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

XDW_GetDocumentAttributeByNameのなかで sValueに文字列を設定するのであれば あらかじめ sValueにデフォルトの文字列を与えておいて呼び出すようにしてやればいいでしょう APIの記述は ByVal sValue as String で行います Dim sValue as String * 256 といった固定文字列 Dim sValue as String とするならば DLLを呼ぶ前に sValue = Space(256) といった具合に初期化しておきます DLLを呼び出す場合には Unicode/Ansi変換を自動で呼び出すと思います VBA側にリターンしてから逆変換をしますし ・・・

その他の回答 (1)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

戻り値の文字コードはUNICODEでしょうか?それともSHIFT-JISですか? 戻り値を扱う場合は検証していませんがByte配列を使えば対応できないでしょうか。 EX. Declare Function MessageBoxPtr Lib "user32.dll" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal text As Long, ByVal caption As Long, ByVal nType As Integer) As Integer Sub aaa() Dim text() As Byte Dim caption() As Byte Dim ret As Integer caption() = StrConv("優勝", vbFromUnicode) text() = StrConv("日本", vbFromUnicode) ret = MessageBoxPtr(0, VarPtr(text(0)), VarPtr(caption(0)), vbOKOnly) End Sub

noname#258812
質問者

補足

迅速な回答ありがとうございます。情報不足で申し訳ないのですが、VC++の関数を2回コールする必要があり、1回目は「null」を渡さなければならないので byte配列は使えないのです。 同じ変数で,ある時は文字列型配列、ある時はnullを代入・・・といったことができるのでしょうか。ユーザ定義型とかにすれば可能なのでしょうか。

関連するQ&A