
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
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側にリターンしてから逆変換をしますし ・・・
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
この回答への補足
迅速な回答ありがとうございます。情報不足で申し訳ないのですが、VC++の関数を2回コールする必要があり、1回目は「null」を渡さなければならないので byte配列は使えないのです。
同じ変数で,ある時は文字列型配列、ある時はnullを代入・・・といったことができるのでしょうか。ユーザ定義型とかにすれば可能なのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 数式が消える 1 2023/03/19 16:55
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DTPicker テキストクリアの方法
-
フォーム、サブフォーム間のデ...
-
VB.NETでのイベントの途中終了
-
GetNextWindowがDLLファイルUse...
-
VBA public変数はどのようなこ...
-
他のフォームから別のフォーム...
-
VBAとVB6.0とC#の速度比較
-
16進数
-
ユーザーフォームへのデータ入...
-
プロシージャまたは関数の引数...
-
コンボボックスからテキストボ...
-
【VB.NET】テキストボックスに...
-
ボールが壁に当たって跳ね返る...
-
カラーの16進表記の足し算
-
#define hoge long longって正...
-
Functionの戻り値を配列にした...
-
Excel VBA: private sub 内の...
-
タイムアウトする仕組みを作りたい
-
ピッ、ってアルファベットでど...
-
VBによる回帰直線のプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストボックスかラベル上の...
-
ExcelのVBAで文章にある複数の...
-
vba 日本語以外を抽出について
-
助けてください!
-
Visual Basicについてお聞きし...
-
VB2010 シリアル通信の文字列...
-
cshスクリプト内での”ヒアドキ...
-
VB.NET コンボボックスからのit...
-
XMLファイルのattribute値がう...
-
アクセスのフィールドに値をペ...
-
ボールの動きがスムーズに動い...
-
[VB6] SQLの作成について
-
VB6.0 sp5]テキストボックスと...
-
C++言語、国際符号翻訳プログラ...
-
vc++のAPI(dll)の引数をVBAでう...
-
【VBS】クリップボード操作につ...
-
LOTUS-123のユーザーフォームに...
-
Docmd.Openreportで範囲印刷を...
-
円頓章を現代語訳して下さい。
-
VBScript、ClipboardDataオブジ...
おすすめ情報