record文の指定について

解決


金魚  2008-09-18 20:16:32  No: 31972

以前メールの送信でご教授いただいた中に(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が悪いとはおもえません。  よろしくおねがいします。


他の  2008-09-18 20:43:49  No: 31973

適当なソースを探してみたところ、

TPBSMTPStatus = ^TBSMTPStatus;

ポインタ渡しになっているようですが・・・


金魚  2008-09-18 22:18:22  No: 31974

他のさん早速の書き込み有難う御座います。

Delphiサンプルがそのようになっていました。

「ポインタ渡し」てなんですか。

ただ、そのようにしないとDLLでエラーが発生します。

  TPBSMTPStatusT : TPBSMTPStatus;      //  ←←←←  ここにわたしが追加しました

上記の部分の指定はこれでいいですか?


カス  2008-09-19 00:10:27  No: 31975

> 「ポインタ渡し」てなんですか。
ぐぐれ


金魚  2008-09-19 00:39:32  No: 31976

カス さん書き込み有難う御座います。
>  ぐぐれ
これなんですか?

皆さんすみません、解らないので変な事、書いているだろうなと思っています。

いろいろ試してみてPOP3の前にクリア文を入れたらエラーが出なくなりました。

    new(TPBSMTPStatusT);

ということは終了時に何かの文で開放しなければいけないのですか?
どなたか教えて下さい。


横から  2008-09-19 00:46:22  No: 31977

>>  ぐぐれ
>これなんですか?
これはね、ネットで検索してみたらって事です。
他、「ぐぐる」・・・Googleで検索する事
わからない事があれば、まずは検索してみるのはいかがでしょうか?
ポインタ渡しなどは沢山ひっかかります。


そのくらいは  2008-09-19 00:49:27  No: 31978

>ということは終了時に何かの文で開放しなければいけないのですか?
newをヘルプで調べればすぐ分かると思うけど。


金魚  2008-09-19 01:18:40  No: 31979

横から さん、そのくらいは  さん、有難う御座いまました。

解決しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加