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 になることはできませんでした。
単に,呼び出し時のOUT_STRの長さが0なだけでは?
VBA側の呼び出しにミスがあるのだと思います。
あと,
> OUT_STR[i] = NULL;
環境によってはエラーです。
C言語のコンパイラの中には,
#define NULL ((void *)0)
と定義されている物がありますから。
NULLと'\0'の違いは知っておくべきです。
VBA側で事前にOUT_STRをSpace()関数で初期化すれば、エラーを出さずに動くように
なりました。
ありがとうございました。