喫茶XRAYトップページ


[11931] DLL内の関数とフォームの関数の実行返信 削除
2018/6/14 (木) 07:41:42 Mr.XRAY
[DLL にて except 使用]
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201806/18060002.txt

abc 2018/06/14(木) 05:58:32

のコードを解読すると以下のようなことのようです.
何とも言えない,面白いのか,変なのか,摩訶不思議なと言うか... (^^:

DLL を使用する側のプロジェクトのコード

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

procedure FormProcA(AText: PChar);stdcall;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure DLL_funcA(AProc: TFarProc); stdcall; external 'Test_DLL.dll';

//-----------------------------------------------------------------------------
//  DLL内の関数を実行
//  引数はこのユニット内で定義している関数
//  つまり,DLLからこのフォームの関数を実行している
//-----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  DLL_funcA(@FormProcA);
end;

//-----------------------------------------------------------------------------
//  この関数をDLLから実行する
//-----------------------------------------------------------------------------
procedure FormProcA(AText: PChar);
begin
  Form1.Memo1.Lines.Add(AText);
end;

end.


DLL のコード

library Test_DLL;

uses
  Windows;

type
  TMyFuncType =  procedure (AText: PChar);stdcall;

var
  FormProcA : TMyFuncType;

//-----------------------------------------------------------------------------
procedure DLL_funcA(AProc: TFarProc); stdcall;
begin
  @FormProcA := AProc;
  FormProcA('*** ABC ***');
end;

//-----------------------------------------------------------------------------
exports
  DLL_funcA;

end.


実行結果です.
実行環境は Windows 7 U64(SP1) + Delphi XE5(UP2) Pro です.
質問された方が書いている LogWriteProc2 は無理です.
何故なら関数内関数になっています.
もちろん,expect は全く関係ありませんです.
もちろん,バグでもありません.

これが朝起きて最初の作業.おそまつ ! (笑)



[11932] Re:DLL内の関数とフォームの関数の実行返信 削除
2018/6/14 (木) 07:56:55 Mr.XRAY
> 何とも言えない,面白いのか,変なのか,摩訶不思議なと言うか... (^^:

単なる stdcall の動作のテストなのかも知れません.
それにしては複雑ですが...


[11933] Re:DLL内の関数とフォームの関数の実行返信 削除
2018/6/14 (木) 12:41:52 Mr.XRAY
> 質問された方が書いている LogWriteProc2 は無理です.
> 何故なら関数内関数になっています.
> もちろん,expect は全く関係ありませんです.


これなんですが,DLL を使用する側を以下とします.

procedure TForm1.Button2Click(Sender: TObject);

  //この関数はinterface部で定義(関数宣言を)していない
  //関数内関数はinterface部で定義(関数宣言)できない
  procedure LogWriteProc2(AText: PWideChar); stdcall
  begin
    Memo1.Lines.Add(AText);
    Memo1.Lines.Add('LogWriteProc2');
  end;

begin
  DLL_funcB(@LogWriteProc2);
end;

そして DLL 側の DLL_funcB を以下のようにします.
もちろん DLL_funcB は exports 部に追加して,var にも次のように追加しておきます.

var
  FormProcA : TMyFuncType;
  LogWriteProc2 : TMyFuncType;

procedure DLL_funcB(AProc: TFarProc); stdcall;
begin
  @LogWriteProc2 := AProc;
  LogWriteProc2('*** DDD ***');
end;

実行するとできてしまうんですね (下図が実行結果).知りませんでした.
で DLL_funcB を以下にすると例外が発生します.当然と言えば当然なのですが.
これが質問された方が言う「バグ」ですね.
自分が意図しない動作をするのは全て「バク」? 好きです,こういう姿勢 (笑)

procedure DLL_funcB(AProc: TFarProc); stdcall;
begin
  try
    @LogWriteProc2 := AProc;
    LogWriteProc2('*** DDD ***');
  except
  end;
end;



[11934] Re2:DLL内の関数とフォームの関数の実行返信 削除
2018/6/14 (木) 12:57:42 Mr.XRAY
> 実行するとできてしまうんですね (下図が実行結果).知りませんでした.

いや,正直驚きました !!


[11935] 良い子は真似しない方がいいと思う返信 削除
2018/6/14 (木) 13:10:45 Mr.XRAY
DLL というのは基本的に各種のプログラム言語から共通して利用するのが目的です.
ただし,特定の言語用として作成することもありますが,
独立して利用できるようにするのがよろしいかと.

しかしながら,今回の質問の方のは特定のユニット専用の DLL となります.
つまり,わさわざ DLL にする意味がありません.
こういう使い方があるのかは分かりませんが,
基本的にはやらない方がいいと思います.

ただし,質問された方の意図が不明なので,これはあくまでも私見です.


[11936] 関数内関数返信 削除
2018/6/14 (木) 14:03:57 Mr.XRAY
今回の場合はプロシージャ内プロシージャーとでも言うのかも知れませんが,
関数内関数は,その関数内だけで使用するためのものです.
それをその関数以外で使用するのであれば,関数内関数にする意味がありません.
と思います.


[11938] 某掲示板の文字化け返信 削除
2018/6/17 (日) 17:00:19 Mr.XRAY
> [DLL にて except 使用]
> http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201806/18060002.txt


掲示板への投稿記事の文字化けのことを書きましたか,
実際には,文字化けが投稿者側で回避できるのかは分かりません.

そのことを調べるには文字化けの投稿をされている方の協力が必要です.
しかし,おそらく,文字化けの投稿をする方の協力が得られることは無理でしょう.


[11940] Re:某掲示板の文字化け返信 削除
2018/6/17 (日) 20:47:49 taka
▼ Mr.XRAYさん
> 掲示板への投稿記事の文字化けのことを書きましたか,
> 実際には,文字化けが投稿者側で回避できるのかは分かりません.
>
> そのことを調べるには文字化けの投稿をされている方の協力が必要です.
> しかし,おそらく,文字化けの投稿をする方の協力が得られることは無理でしょう.


某掲示板の場合は、
基本的に掲示板の設置者の技術的な問題ですね

該当サイトをみてみましたが
httpのレスポンスヘッダの文字コード宣言と
コンテンツ内のhtmlの文字コード宣言は一致していますので
ブラウザが誤認識することはまずないと思います。

よくみてもらえばわかりますが、文字化けが始まっているのは、
投稿者が編集できない、年月日の横の曜日から後の文字が化けています。

推測ですが
・サーバー側に文字コードを自動認識するようなコードが含まれているとか
・htmlエスケープする処理に問題があるとか
たまたま誤動作する地雷ワードを踏んでしまって
誤作動しているだけだと思います

要するにですね。
あれですよ
Delphi win32でいうと 規格外の文字は自動で ? になりますね
そういう文字を ? にしないで そのままにして
htmlエスケープしているような超初歩的な間違いのような気がします
なんとなくですけど



[11941] Re2:某掲示板の文字化け返信 削除
2018/6/17 (日) 20:52:30 taka
> ▼ Mr.XRAYさん
> > 掲示板への投稿記事の文字化けのことを書きましたか,
> > 実際には,文字化けが投稿者側で回避できるのかは分かりません.

メモ帳で一度ANSIを指定して保存して、閉じて開いてコピペして
投稿すれば文字化けしないような気もします。


[11942] Re3:某掲示板の文字化け返信 削除
2018/6/17 (日) 22:25:50 Mr.XRAY
▼ takaさん

> メモ帳で一度ANSIを指定して保存して、閉じて開いてコピペして
> 投稿すれば文字化けしないような気もします。


この「保存」がポイントのような気がしますね.
う〜む.


[11943] Re2:某掲示板の文字化け返信 削除
2018/6/17 (日) 22:51:18 Mr.XRAY
▼ takaさん

> 該当サイトをみてみましたが
(以下,略)

今みたら,

>そうはいっても… 2018/06/17(日) 19:16:31 書込者ID:[ #$!'##"JEG?==9<8 44 3, ]

という書き込みがありした.
喫茶XRAY ではこうなります.
問題は,書込者ID : の [] 内の文字なんです.
この文字列は文字化けする方が書き込みした時に,解読のプログラムで解読して
表示されたのと同じ感じです.
では,この方はどうやって,某掲示板に書き込んだのでしょう.

う〜む.この方の協力も難しそうです.
こちらの訊くことに素直に反応してくれそうもないような...(笑)

問題のスレッドのリンクを再掲しておきます.
[DLL にて except 使用]
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201806/18060002.txt


[11944] Re3:某掲示板の文字化け返信 削除
2018/6/18 (月) 05:56:43 taka
▼ Mr.XRAYさん
> ▼ takaさん
>
> > 該当サイトをみてみましたが
> (以下,略)
>
> 今みたら,
>
> >そうはいっても… 2018/06/17(日) 19:16:31 書込者ID:[ #$!'##"JEG?==9<8 44 3, ]
>

某掲示板での文字化け経験者が語っていますね

一番最初の文字化けしていないように見える投稿
> abc 2018/06/12(火) 20:16:28

firefoxなどのブラウザのソース表示でみてもらえばわかりますが
書き込み内容は、文字化けしていない状態で
ヘッダの 書込者IDの横の [] の部分だけ
なぜかShift_JIS規格外の文字が混入しています

掲示板自体が Shift_JIS規格外 の文字を生成していることから
まず掲示板設置者が文字コード体系の知識がほとんどないレベルと考えられます。

なので ユーザーがあれこれしても無駄なような気がします。

[11945] Re4:某掲示板の文字化け返信 削除
2018/6/18 (月) 11:27:34 Mr.XRAY
▼ takaさん

> なので ユーザーがあれこれしても無駄なような気がします。

う〜ん.
何かまだスッキリしないような... (^^;

>某掲示板での文字化け経験者が語っていますね

今みたら当事者も書き込みしていますね.
文字化けしていませんが,どうやって書き込みしたのかな.
この手の方は,こういうことを書いてくれないんですよね.残念ですが.


[11947] Re5:某掲示板の文字化け返信 削除
2018/6/18 (月) 11:31:52 Mr.XRAY
>TEAD で SJIS で保存してもう1回読み込んで、コピペで貼り付けても 書込者ID は文字化けするな

これを,

「TEAD で SJIS で保存したテキストをコピペして書き込みすると文字化けはしないが,
書込者ID は相変わらず文字化けする」

と解釈すると,投稿する方にとっては面倒かも知れませんが,
某掲示板の管理人の手をわずらわすことは当面避けることができそうです.
私の推測ですが,今回の文字化けの質問の方は,もしかしたら ATOK を使用している
のではないかと思います.


[11949] Re6:某掲示板の文字化け返信 削除
2018/6/18 (月) 18:01:29 Mr.XRAY
taka さんの

> メモ帳で一度ANSIを指定して保存して、閉じて開いてコピペして
> 投稿すれば文字化けしないような気もします。


がビンゴということで Q and A の管理人の方にメールしました.
今見たら,既にスレッドの最後の投稿欄の下に追加されていました.
taka さん,福士さん,そして過去にも私のくだらない話に付き合っていただいた
皆さん,ありがとうございます.
おかげ様でモヤモヤが少し,いやかなりスッキリしました.

なお,書込者 ID は文字化けしないよう対処したそうです.
ということは,もしかしたら Shift-JIS にしなくても文字化けしなくなったりして...


[11950] Re7:某掲示板の文字化け返信 削除
2018/6/18 (月) 18:10:52 Mr.XRAY
> > メモ帳で一度ANSIを指定して保存して、閉じて開いてコピペして
> > 投稿すれば文字化けしないような気もします。


これを読んで,自分の環境を書いて投稿したのですが,
実を言うと,当事者が反応するとは思っていませんでした.
ても,贅沢を言わせてもらうと,私が環境を書いているのだから,
当事者にも書いてほしかったです.
無理か...てすよね,


[11952] Re8:某掲示板の文字化け返信 削除
2018/6/18 (月) 18:58:56 Mr.XRAY
>私の推測ですが,今回の文字化けの質問の方は,もしかしたら ATOK を使用している
>のではないかと思います.


この ATOK という推測なんですが,福士さんが,

>Shift_JIS範囲外の文字が(予期せず)入ると文字化けする、というのはありましたね。

と書いています.これなんです.
ATOK は設定も関係するかもしれませんが,ユニコードな文字 (コードポイントが)
が通常に入力できるのだそうです.それがもしかしてと思ったわけです.

Windows Vista で全面的にユニコード化されたので,ATOK を悪者にすることは
できませんが,内部的には Shift-JIS が使われています.
掲示板にユニコードのコードポイントの文字が入力された時に文字化けが発生
するのではないかと.


[11951] Re7:某掲示板の文字化け返信 削除
2018/6/18 (月) 18:57:11 taka
▼ Mr.XRAYさん
> taka さんの
>
> > メモ帳で一度ANSIを指定して保存して、閉じて開いてコピペして
> > 投稿すれば文字化けしないような気もします。
>
> がビンゴということで Q and A の管理人の方にメールしました.
> 今見たら,既にスレッドの最後の投稿欄の下に追加されていました.
> taka さん,福士さん,そして過去にも私のくだらない話に付き合っていただいた
> 皆さん,ありがとうございます.
> おかげ様でモヤモヤが少し,いやかなりスッキリしました.
>
> なお,書込者 ID は文字化けしないよう対処したそうです.
> ということは,もしかしたら Shift-JIS にしなくても文字化けしなくなったりして...

テストフォームを作って試したところ
unicodeなどの文字は、自動でブラウザがエスケープして &#コード番号; で送信することがわかりました。
なので、なぜ、コピペで直るのか? ちょっとモヤモヤしてます。

cgi側での簡単な対処として
post値を全部foreachで
シフトジス → utf-8 →  シフトジス
に変換すれば、
(利用している変換ライブラリによりますが)
投稿者のメモ帳への保存作業はいらなくなるかもしれないです。



[11953] Re8:某掲示板の文字化け返信 削除
2018/6/18 (月) 19:08:55 Mr.XRAY
▼ takaさん

> unicodeなどの文字は、自動でブラウザがエスケープしてコード番号で送信することがわかりました。
> なので、なぜ、コピペで直るのか? ちょっとモヤモヤしてます。


taka さんが文字化けしなくなるかも知れないと言ったのにぃ (笑)
なぜと言われても.
UTF-16 のコードポイントを UTF-8 に変換する過程の現象たとは思うのですが.

> cgi側での簡単な対処として
> post値を全部foreachで
> シフトジス → utf-8 →  シフトジス
> に変換すれば、


そうですね.少し様子を見て提案することにしますか.
と言っても,メールにこのスレッドのこと書いてしまっていますが.ハハハッ


[11954] Re9:某掲示板の文字化け返信 削除
2018/6/18 (月) 20:08:32 taka
▼ Mr.XRAYさん
> ▼ takaさん
>
> > unicodeなどの文字は、自動でブラウザがエスケープしてコード番号で送信することがわかりました。
> > なので、なぜ、コピペで直るのか? ちょっとモヤモヤしてます。
>
> taka さんが文字化けしなくなるかも知れないと言ったのにぃ (笑)
> なぜと言われても.
> UTF-16 のコードポイントを UTF-8 に変換する過程の現象たとは思うのですが.
>
> > cgi側での簡単な対処として
> > post値を全部foreachで
> > シフトジス → utf-8 →  シフトジス
> > に変換すれば、
>
> そうですね.少し様子を見て提案することにしますか.
> と言っても,メールにこのスレッドのこと書いてしまっていますが.ハハハッ


もしかすると掲示板が古そうなので
post変数などをデコードする処理を自分で書いている可能性があり、
そこで文字化けが発生している場合は
CGIライブラリを呼び出して デコードされたパラメータを参照するように書き換えると
直るかと思います。
use CGI;
my $cgi = new CGI;
# $cgi->param("name") # post,getの区別はない


追記
 perl 文字化け Shift_JIS
 ツ  文字化け
でたくさんヒットするので、
確実に再現する方法を見つけないと原因個所は特定できないでしょうね。


[11955] Re10:某掲示板の文字化け返信 削除
2018/6/18 (月) 22:46:26 Mr.XRAY
▼ takaさん
 
> もしかすると掲示板が古そうなので

かなり昔から設置している掲示板ですから,そう言えないこともないですね.
CGI そのものは UTF-8 でも,対象が Windows 上で使用するブラウザだった
わけですから,Shift-JIS が対象ということだったと思います.
全面的に Unicode になったのは Windows Vista ですから.
Windows XP も意識的に操作すれば Unicode も使用できましたが.


[11957] Re9:某掲示板の文字化け返信 削除
2018/6/18 (月) 22:57:39 taka
▼ Mr.XRAYさん
> そうですね.少し様子を見て提案することにしますか.
> と言っても,メールにこのスレッドのこと書いてしまっていますが.ハハハッ

ダウンロードして
バイナリエディタで見ると
[]の部分は ヌルバイトを含むバイナリデータであるとわかりましたので
そこが悪さをしている可能性がありますね。

新しい投稿から
[]の部分は直ったようなので様子見ですね。


[11958] Re10:某掲示板の文字化け返信 削除
2018/6/18 (月) 23:25:26 Mr.XRAY
▼ takaさん

> バイナリエディタで見ると
> []の部分は ヌルバイトを含むバイナリデータであるとわかりましたので
> そこが悪さをしている可能性がありますね。


なるほど.そういうことなのか.

> []の部分は直ったようなので様子見ですね。

何かうまく逃げたような (笑)
でも新しい方がいいかも.前は記号みたいのにこだわりがあったのかもですね.


[11959] Re11:某掲示板の文字化け返信 削除
2018/6/19 (火) 05:52:18 taka
▼ Mr.XRAYさん
> ▼ takaさん
>
> > バイナリエディタで見ると
> > []の部分は ヌルバイトを含むバイナリデータであるとわかりましたので
> > そこが悪さをしている可能性がありますね。
>
> なるほど.そういうことなのか.
>
> > []の部分は直ったようなので様子見ですね。
>
> 何かうまく逃げたような (笑)
> でも新しい方がいいかも.前は記号みたいのにこだわりがあったのかもですね.


・ファイル入出力で文字コードをしていないと自動でエンコード/デコードを受けるとか
・\ がはいっていると化けるとか
・古いjcode使っていると化けるとか
・jcodeをバージョンアップすると化けるとか
・perlをバージョンアップすると化けるとか
・perlで文字化けすると ツ ばかりの文字になるとか
いろんな情報があるようなので、ソースコードがない状態で推測するのは厳しいですね。



[11946] Re4:某掲示板の文字化け返信 削除
2018/6/18 (月) 11:29:05 福士
にちゃんねる(いまは5ちゃんねるか)あたりだと、macとか使ってて書き込んだときに、
Shift_JIS範囲外の文字が(予期せず)入ると文字化けする、というのはありましたね。

[11948] Re5:某掲示板の文字化け返信 削除
2018/6/18 (月) 11:34:46 Mr.XRAY
▼ 福士さん
> にちゃんねる(いまは5ちゃんねるか)あたりだと、macとか使ってて書き込んだときに、
> Shift_JIS範囲外の文字が(予期せず)入ると文字化けする、というのはありましたね。


なるほど.
CGI (多くは perl だと思いますが) 作成も結構大変ですね.


INCM/CMT
Cyclamen v3.82