tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル DLLへの文字列ポインタについて
投稿日: 2008/05/15(Thu) 22:17
投稿者cc
VB6.0 sp6からVC++6.0で作成したDLL内関数(以下のような仕様)へデータを渡したいです。
その中で、構造体内の文字列先頭ポインタの扱いがよく分からず困っております。

DLL内関数
Declare Function Func Lib "cmakelib" Alias "_DllFunc@4" (strct_dat As STRCT) As Long

STRCTは、独自の構造体でCでは

typedef struct {
    int         ldat;       // データ
    char        *lptr;      // ファイル名
} STRCT, *PSTRCT;

と定義されています。
Funcでは、lptrの参照のみするようです。(変更はしない)

Q1.VBでは
        Type STRCT
                ldat_A As Long       ' データA
                lptr As Long         ' ファイル名
                ldat_B As Long       ' データB
        End Type
    の様に定義するのでしょうか?
    それとも
        Type STRCT
                ldat_A As Long       ' データA
                lptr As String       ' ファイル名
                ldat_B As Long       ' データB
        End Type
        の様に定義するのでしょうか?

Q2.
    Longとして定義した場合、
        Dim strct_d As STRCT
        strct_d.ldat_A = 5           ' データA
        StrPtr(StrConv("test.txt", vbFromUnicode)) ' ファイル名
        strct_d.ldat_B = 6           ' データB
        ret = DllFunc(strct_d)
    の様に処理を書く事は、問題ないのでしょうか?

Q3−1.
    stringとして定義した場合、
    "String"と"char*"でサイズが異なり、
  データBが間違ってDLLへ伝わる事は無いですか?
    (API等でchar*を単独で渡す場合は、stringのByVal渡しで良いかと思いますが、
     ユーザ定義型の場合はどうなのでしょうか?)
Q3−2.
    DLL内でlptrへアクセスしたときに、正常に文字列を取得できるのでしょうか?

Q3−3.
    stringとして定義した場合は、
        Dim strct_d As STRCT
        strct_d.ldat_A = 5           ' データA
        strct_d.lptr = "test.txt"    ' ファイル名
        strct_d.ldat_B = 6           ' データB
        ret = DllFunc(strct_d)
    の様に処理を書く事は、問題ないのでしょうか?


以上、どなたかご存じの方いらっしゃいましたら、
アドバイス頂けますでしょうか。
よろしくお願いします。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。