重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

Excelで開発しなければならない事情があり、
vc++のAPIが持っている関数を
ExcelVBAでコールしておりますが、エラー1041でExcelが強制終了してしまいます。
VBAからVisual C++にchar*型で渡し、ByRef String型でVBAにて受け取ります。

VCの関数の第四引数「char* 型/attribute_value」をVBAの「String 型/sValue」で受け取る際にエラーになっているようです。

VBAでcharに相当する変数型がないためと思われますが、何かよいアイデアがありましたらご教授願います。

--VC--
XDW_GetDocumentAttributeByName(h, attribute_name, &attribute_type, attribute_value, size, NULL);
--VBA--
<宣言部>
Public Declare Function XDW_GetDocumentAttributeByName Lib "C:\Users\○○○\Desktop\dwsdk710jpn\XDWAPI\DLL\xdwapi.dll" (ByVal lnghandle As Long, ByVal sName As String, ByRef lngType As Long, ByRef sValue As String, ByVal lngSize As Long, ByVal reserved As String) As Long

<呼び出し部>
Dim lngHandle As Long
Dim sName as String
Dim lngType As Long
Dim sValue As String
Dim lngSize as Long
Dim tmpSize as Long
lngSize = 0
sName = "keiyaku"

tmpSize = XDW_GetDocumentAttributeByName(lngHandle, sName, sType, sValue, lngSize, vbNullString)

XDW_GetDocumentAttributeByName lngHandle, sName, sType, vbNullString, tmpSize, vbNullString
degug.print sValue

A 回答 (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側にリターンしてから逆変換をしますし ・・・
    • good
    • 3

戻り値の文字コードは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

この回答への補足

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

補足日時:2011/01/31 23:47
    • good
    • 0

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