以前メールの送信でご教授いただいた中に(BSMTP.DLL)受信のサンプルもあったので利用したところ実行時メモリーエラーが発生します。 元はC言語で記述されているのでわかりません。たぶんわたしのRecoed文の指定が悪いと思います。どなたかRecoed文につ教えて下さい
C言語のサンプルです。
struct RetArray {
int counter;
char* array[256];
};
extern "C"
__declspec(dllimport)
void BFreeArray(RetArray* parray);
extern "C"
__declspec(dllimport)
int BPOP3( LPCSTR szServer, // pop3 server name
LPCSTR szName, // NAME
LPCSTR szPass, // PASSWORD
LPCSTR szCommand,// COMMAND
LPCSTR szPath, // directory
RetArray* RetArray, // return ARRAY LIST
LPSTR msg // 80 bytes length message area
);
char msgx[80];
RetArray ret1,ret2;
int rc = BPOP3( "server1","user1","pass1",
"save 1","c:\\mail",&ret1,msgx);
if (rc <= 0)
return false;
rc = BMIME("get",ret1.array[0],"c:\\mail",&ret2,msgx);
if (rc > 0) {
FILE *fp = ::fopen("c:\\mail\\mail.txt","wb");
for (int i= 0;i < rc ;i++) {
::fwrite(ret2.array[i],1,strlen(ret2.array[i]),fp);
::fwrite("\015\012",1,2,fp); // put CRLF
}
::fclose(fp);
}
DeleteFile(ret1.array[0]);
わたしがDelphiサンプルを参考に作成したものです。
interface
uses Windows;
type
TBSMTPStatus = record
Counter: integer;
Status : array[0..255] of LPSTR;
end;
TPBSMTPStatus = ^TBSMTPStatus;
Const
Bsmtp = 'Bsmtp.DLL';
var
Form1: TForm1;
function BPOP3(szServer, // pop3 server name
szName, // NAME
szPass, // PASSWORD
szCommand, // COMMAND
szPath :LPCSTR; // directory
Status :TPBSMTPStatus; // return ARRAY LIST
msg :LPSTR // 80 bytes length message area
):Integer; cdecl external Bsmtp;
implementation
procedure TForm1.Button1Click(Sender: TObject);
Const
SV_NAM := 'サーバー名';
ML_NAM := 'ユーザー名';
PASSW = 'パスワード';
STATw = 'SAVEALL'; // 読込区分 全件読込
passs = 'メール保存場所\';
var
Sspa : String;
wkstr : array[0..80]of Char;
F_NAM : String;
Sih_Da : String;
LL,MM,NN,PP,QQ,RR,SS: Integer;
Kou_Na: array[0..70] of string; // ファイル名称
TPBSMTPStatusT : TPBSMTPStatus; // ←←←← ここにわたしが追加しました
begin
Mess.Caption := '[メール読込処理中...]';
Form1.Repaint;
// メールの読込
LL := BPOP3(PChar(SV_NAM), // pop3 server name
PChar(ML_NAM), // NAME
PChar(PASSW), // PASSWORD
PChar(STATw), // COMMAND
PChar(passs), // directory
TPBSMTPStatusT, // return ARRAY LIST
wkstr); // 80 bytes length message area
if LL >= 1 Then begin
// メールの取り出し
MM := TPBSMTPStatusT.Counter - 1; // ←←←← エラーがこの箇所で発生
// ↓↓↓↓↓↓↓↓↓↓↓↓↓ 以下の分をコメントにするとエラーがでない
for PP := 0 to MM do begin
Sspa := TPBSMTPStatusT.Status[PP];
LL := Length(Sspa); // ファイル名称のサイズ
for QQ := 1 to LL do begin // 読込ファイル名取り出し
if Copy(Sspa,QQ,2) = '\\' then begin // \\の文字
Kou_Na[PP] := Copy(Sspa,QQ+2,LL); // 読込ファイル名
break;
end;
end;
この中に処理文を追加しようと思っています。
end;
// ↑↑↑↑↑↑↑↑↑↑↑↑↑ 以上の分をコメントにするとエラーがでない
end else begin
Showmessage(wkstr);
end;
end;
end.
長くてすみませんが上記の文でfor文の箇所をコメントにするとメモリーエラーは発生しません。
DLLが悪いとはおもえません。 よろしくおねがいします。
適当なソースを探してみたところ、
TPBSMTPStatus = ^TBSMTPStatus;
ポインタ渡しになっているようですが・・・
他のさん早速の書き込み有難う御座います。
Delphiサンプルがそのようになっていました。
「ポインタ渡し」てなんですか。
ただ、そのようにしないとDLLでエラーが発生します。
TPBSMTPStatusT : TPBSMTPStatus; // ←←←← ここにわたしが追加しました
上記の部分の指定はこれでいいですか?
> 「ポインタ渡し」てなんですか。
ぐぐれ
カス さん書き込み有難う御座います。
> ぐぐれ
これなんですか?
皆さんすみません、解らないので変な事、書いているだろうなと思っています。
いろいろ試してみてPOP3の前にクリア文を入れたらエラーが出なくなりました。
new(TPBSMTPStatusT);
ということは終了時に何かの文で開放しなければいけないのですか?
どなたか教えて下さい。
>> ぐぐれ
>これなんですか?
これはね、ネットで検索してみたらって事です。
他、「ぐぐる」・・・Googleで検索する事
わからない事があれば、まずは検索してみるのはいかがでしょうか?
ポインタ渡しなどは沢山ひっかかります。
>ということは終了時に何かの文で開放しなければいけないのですか?
newをヘルプで調べればすぐ分かると思うけど。
横から さん、そのくらいは さん、有難う御座いまました。
解決しました。
ツイート | ![]() |