お世話になります。
過去ログや、ネット上を調べまわったりMSDNを見ながら
VB6.0から自作DLL(VC)を呼び、DLL内で領域確保して値を設定し
VB側のLISTBOXに表示するプログラムを作っています。
VBでデバッグ実行時は正常に動作しているような動き(期待通り)
なのですが、EXEをつくって実行したり
VCのデバッグでVBのEXEから動かすとEXEが強制終了してしまいます。
以下にソースを載せますので、ヒントなど教えていただけないでしょうか。
VB-----------------------------------------------
Option Explicit
Private Declare Function DevList Lib "TEST002.dll" (data() As AAAA) As Integer
Private Type AAAA
ix As Integer
str As String
End Type
Private Sub Command1_Click()
Dim iRet As Integer
Dim x As Long
Dim data() As AAAA
Dim i As Long
List1.Clear
iRet = DevList(data)
MsgBox "iRet:" & iRet & vbCrLf & "UBound:" & UBound(data())
For i = 0 To UBound(data())
List1.AddItem data(i).ix & " " & data(i).str
Next i
End Sub
Private Sub Form_Load()
List1.Clear
End Sub
VC(test002.c)--------------------------------------------
#include <stdio.h>
#include <windows.h>
#include <locale.h>
#include "TEST002.h"
#define FOOBUFSIZE 10
long __declspec(dllexport) WINAPI DevList(LPSAFEARRAY* ppsa)
{
AAAA uaaa; //構造体(ユーザー定義型)
LPSAFEARRAY psa; // = *ppsa;
LONG idx[1], lb, ub;
static char bufa[FOOBUFSIZE];
static wchar_t bufw[FOOBUFSIZE];
setlocale(LC_ALL, "");
if( *ppsa != NULL ) {
if(FAILED(SafeArrayDestroy(*ppsa))) return 0;
}
//配列を再確保(0〜6)
if(FAILED(SafeArrayAllocDescriptor(1,ppsa))) return 0;
(*ppsa)->cbElements = sizeof(AAAA);
(*ppsa)->fFeatures = FADF_STATIC;
(*ppsa)->rgsabound[0].lLbound = 0;
(*ppsa)->rgsabound[0].cElements = 7; // 個数
if(SafeArrayAllocData((*ppsa)) != S_OK ) return 0;
// データ更新
psa = *ppsa;
SafeArrayLock(psa);
SafeArrayGetLBound(psa, 1, &lb);
SafeArrayGetUBound(psa, 1, &ub);
for (idx[0] = lb; idx[0] <= ub; idx[0]++)
{
SafeArrayGetElement(psa, &idx[0], &uaaa);
uaaa.ix = idx[0];
wsprintf(bufa, "Name:%d", idx[0]);
mbstowcs(bufw, bufa, FOOBUFSIZE);
SysFreeString(uaaa.str[0]);
uaaa.str[0] = SysAllocString(bufw);
SafeArrayPutElement(psa, &idx[0], &uaaa);
}
SafeArrayUnlock(psa);
return 1;
}
VC(test002.def)--------------------------------------------
LIBRARY "test002"
DESCRIPTION 'test002 Windows Dynamic Link Library'
EXPORTS
DevList @1
VC(test002.h)--------------------------------------------
extern long __declspec(dllexport) WINAPI DevList(LPSAFEARRAY* ppsa);
typedef struct tagAAA
{
long ix;
BSTR str[10];
} AAAA;
おそらく
> BSTR str[10];
が間違っています。
VBでは
> str As String
と単なる文字列ですが、C側では文字列“配列”となっています。
たんに
BSTR str;
でいいんじゃないでしょうか?
Blue様
早速の回答ありがとうございました。
ご指摘の個所を修正することにより正しく動作いたしました。
ツイート | ![]() |