tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB.NETからVC++作成したDLL呼び出す問題
記事No8290
投稿日: 2008/10/06(Mon) 16:36
投稿者ato
atoです。

VB.NETで下記のDLLを呼び出す際に甘く行きません。
ご教授のほど、よろしくお願いいたします。

extern "C" __declspec(dllexport) int Token(const char * pszPIN, char* pszPasscode)
{
    LONG ret = 0;
    LONG lTokenServiceHandle;
    LONG lTokens, lDefaultToken;
    LPTOKENBASICINFO lpTokens = new TOKENBASICINFO[100];
    DWORD dwBufferSize = 100 * sizeof(TOKENBASICINFO);
    char chPassword[32];
    char chPIN[9];
    char chPASSCODE[12];
    char chNextPASSCODE[12];
    char chTokencode[12];
    char chNextTokencode[12];
    DLLINFO pDllInfo;
    LPTOKENERRORINFO pErrorInfo;

    if(OpenTokenService(&lTokenServiceHandle) > 0)
    {
        if(EnumToken(lTokenServiceHandle, &lTokens, &lDefaultToken, lpTokens, &dwBufferSize) > 0)
        {
            LPTOKENBASICINFO lpToken = lpTokens;
            if(lTokens > 0)
            {
                chPassword[0] = '\0';
                if(SelectToken(lTokenServiceHandle, lpTokens[0].serialnumber, NULL, chPassword) > 0)
                {
                    strcpy(chPIN, pszPIN);
                    GetPasscode(lTokenServiceHandle, chPIN, pszPasscode, chNextPASSCODE, chTokencode, chNextTokencode);
                    ret = 1;
                }
            }
        }

        CloseTokenService(lTokenServiceHandle);
    }

    delete lpTokens;
    return ret;
}

以上です。

[ツリー表示へ]
タイトルRe: VB.NETからVC++作成したDLL呼び出す問題
記事No8294
投稿日: 2008/10/06(Mon) 21:38
投稿者Hongliang
これだけ載せられても回答しようがありません。
この関数自体の動作は(C からの呼び出しなどで)確認しましたか?
VB.NET ではどう宣言してどう呼び出していますか?

[ツリー表示へ]
タイトルRe^2: VB.NETからVC++作成したDLL呼び出す問題
記事No8295
投稿日: 2008/10/07(Tue) 11:07
投稿者ato
情報少なくてすみませんでした。

VC側は動作確認を取れてます。

VB側
    'Tokenなど取得
    <DllImport("token.dll", CharSet:=CharSet.Auto)> _
    Public Function Token( _
                    ByRef chPIN As Long, _
                    ByRef chPASSCODE As Long) As Long
    End Function

メソッドに下記のように呼んでます。
        Dim sPass As Long
        Dim iRet As Integer

        iRet = Token(chPIN, sPass)

以上、よろしくお願いします。

[ツリー表示へ]
タイトルRe^3: VB.NETからVC++作成したDLL呼び出す問題
記事No8296
投稿日: 2008/10/07(Tue) 12:37
投稿者魔界の仮面弁士
>     <DllImport("token.dll", CharSet:=CharSet.Auto)> _
引数に文字列データがあるなら、CharSet の指定が必要です。
引数に文字列データが無いなら、CharSet の指定は不要です。

>     Public Function Token( _
>                     ByRef chPIN As Long, _
>                     ByRef chPASSCODE As Long) As Long
Long とは「64ビットの符号付き整数型」なので、これではサイズが異なります。
今回の定義でいうと、
 Token(ByVal chPIN As String, ByVal chPASSCODE  As StringBuilder) As Integer
ではないかな。もしもポインタで渡したいなら As IntPtr にしましょう。

[ツリー表示へ]
タイトルRe^4: VB.NETからVC++作成したDLL呼び出す問題
記事No8297
投稿日: 2008/10/07(Tue) 13:07
投稿者ato
ご回答ありがとうございました。
無事解決できました。

[ツリー表示へ]