VC++6.0の自作DLL関数でアプリケーションエラー

[戻る]
FT [E-Mail] 2002/03/04(月) 21:27:48
Access97のVBAからVC++5.0でビルドされていたDLLを外部関数として使うアプリ
があるのですが、今回の開発で
Access97をAccess2000
VC++5.0をVC++6.0
へコンパートしたところ、strncpy関数のところで「Accessのアプリケーション
エラー」が発生します。
対処法が分からなくて困っております。ご教授よろしくお願いします。

Accsss VBA での宣言
Declare Function kp_henkan3 Lib "xxxxxxxx.dll" _
        (ByVal IN_STR As String, ByVal OUT_STR As String) _
        As Long

kp_henkan3関数のVC++ソース
int WINAPI kp_henkan3(LPCTSTR IN_STR, char *OUT_STR)
{
    int                     i;
    static unsigned char    sDummy[513];

    /* 文字列変換 */
    for( i=0; *(IN_STR+i); i++ ) {
        switch( *(IN_STR+i) % 3 ) {
        case 0 : 
            sDummy[i] = *(IN_STR+i) - 3;
            if( sDummy[i] < 0x20 ) {
                sDummy[i] = sDummy[i] + 0x20;
            }
            break;
        case 1 :
            sDummy[i] = *(IN_STR+i);
            break;
        case 2 : 
            sDummy[i] = *(IN_STR+i) + 3;
            if( sDummy[i] > 0x7E ) {
                sDummy[i] = sDummy[i] - 0x7E;
            }
            break;
        }
    }

    strncpy(OUT_STR, (LPTSTR)sDummy, i);
    OUT_STR[i] = NULL;

    return 0;
}

エラーメッセージの内容
"0x09ec2211" の命令が "0x00000000" のメモリを参照しました。
メモリが "written" になることはできませんでした。

YuO [E-Mail] 2002/03/04(月) 21:55:53
単に,呼び出し時のOUT_STRの長さが0なだけでは?
VBA側の呼び出しにミスがあるのだと思います。

あと,
> OUT_STR[i] = NULL;
環境によってはエラーです。
C言語のコンパイラの中には,
#define NULL ((void *)0)
と定義されている物がありますから。

NULLと'\0'の違いは知っておくべきです。

FT [E-Mail] 2002/03/05(火) 12:07:32
[[解決]]
VBA側で事前にOUT_STRをSpace()関数で初期化すれば、エラーを出さずに動くように
なりました。
ありがとうございました。

古いスレッドには追加発言できません。