自作DLLをEXEから実行すると落ちます(長文)

解決


レベル1  2006-12-02 00:05:27  No: 97318

お世話になります。
過去ログや、ネット上を調べまわったり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;


Blue  2006-12-02 00:12:01  No: 97319

おそらく
>    BSTR str[10];
が間違っています。

VBでは
>  str   As String
と単なる文字列ですが、C側では文字列“配列”となっています。

たんに

BSTR str;

でいいんじゃないでしょうか?


レベル1  2006-12-02 00:48:02  No: 97320

Blue様
早速の回答ありがとうございました。
ご指摘の個所を修正することにより正しく動作いたしました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加