BDEエリアスとTSession
BDEのエリアスからPATHを調べたい。
で、TSessionを使ってエリアスの一覧やエリアスの情報を得られますが、問題はこのTSessionの使い方です。
普通に TSession* session = new TSession (NULL); とかやって、セッション名を自動的につけるようにさせていました。
で、特定のエリアスのパスを返す関数を、実行時ライブラリにして、他のツールと共有しようと思った訳です。
まず、requiresに rtl.bpi, bdertl.bpi あたりが必要だったんですけど、これをコンパイルしたら普通にコンパイルが通って、パッケージライブラリと、インポートライブラリ、それから静的リンク用のライブラリとができあがったんですが、このパッケージライブラリを実行時ライブラリとして利用すると、bdertl.bplでメモリアクセス違反が出る。
で、どうやらTSessionList::AddSessionでTListにTThreadList.LockListを代入している所でエラーが起きてるようだ。
とりあえず、VCLはDelphiで、C++ではないが、こんな感じでbegin直後でエラーが起きるようだ。
DbTables.pas
で、調べてみたんですね。
そしたら、スレッドセーフにするため(?)に、Sessions変数のOpenSessionでオブジェクトを取得すればいいみたいですね。
この時、引数にセッション名を渡して、該当するセッションがあれば、そのセッションが返されて、該当セッションが見つからなければ、新しいセッションにその名前をつけて返してくれるらしい。
これが正しい使い方だったのか。
早速、パッケージを修正してから、サンプルプログラムを動かしたら、今度はエラーが出なくなった。
TSessionは基本的にはSessions変数からいただくものだったんですね。
ヤレヤレです。
ついでに見つけたんだが、borland\CBuilder6\source\vcl\Db.hppの1211行目あたりに、Currencyというプロパティがある。
TCurrencyFieldなんだが、TFloatFieldから派生している。
で、派生元クラスのTFloatFieldを見てみると、プロパティはcurrencyだ . . . 。
実際に、borland\cbuilder6\source\include\vcl\db.hppのTCurrencyField には小文字で書かれている。
C++では文字の大小を区別するので、これは別のプロパティとなる。
しかし、TCurrencyFieldでは、 __property Currency = {default=1}; と型もなく書かれていて、試しにちょっと工夫してこれをコンパイルしてみると、やはりここで、宣言エラーが不正だというエラーが出ますね。
で、先頭のCを小文字のcに変更してみました。
コンパイルも無事通りました。
うぅむ。
なんで、include\vcl\db.hppとsource\vcl\db.hppが違うのかは、勉強不足なのか全然わからん。
同じファイルのコピーじゃダメなんだろうか?
windowsなのでdiff見ないな物の手持ちもないので、比較はしていませんが実際どうなんでしょうね。
この頃はborlandだったもんな。
会社名がよく変わるツールだな。
インプライズになってボーランドに戻って、コードギアになってから、エンバカデロだもんな。
バージョンによってインストールされているディレクトリが全然違うから、戸惑うんだよな。
エンバカデロになってからバージョンアップしてないから、どんなもんだかわからないけど . . . 。
で、TSessionを使ってエリアスの一覧やエリアスの情報を得られますが、問題はこのTSessionの使い方です。
普通に TSession* session = new TSession (NULL); とかやって、セッション名を自動的につけるようにさせていました。
で、特定のエリアスのパスを返す関数を、実行時ライブラリにして、他のツールと共有しようと思った訳です。
まず、requiresに rtl.bpi, bdertl.bpi あたりが必要だったんですけど、これをコンパイルしたら普通にコンパイルが通って、パッケージライブラリと、インポートライブラリ、それから静的リンク用のライブラリとができあがったんですが、このパッケージライブラリを実行時ライブラリとして利用すると、bdertl.bplでメモリアクセス違反が出る。
で、どうやらTSessionList::AddSessionでTListにTThreadList.LockListを代入している所でエラーが起きてるようだ。
とりあえず、VCLはDelphiで、C++ではないが、こんな感じでbegin直後でエラーが起きるようだ。
DbTables.pas
procedure TSessionList.AddSession(ASession: TSession);
var
List: TList;
begin
List := FSessions.LockList; { ここでエラー発生!! }
try
if List.Count = 0 then ASession.FDefault := True;
List.Add(ASession);
finally
FSessions.UnlockList;
end;
end;
var
List: TList;
begin
List := FSessions.LockList; { ここでエラー発生!! }
try
if List.Count = 0 then ASession.FDefault := True;
List.Add(ASession);
finally
FSessions.UnlockList;
end;
end;
で、調べてみたんですね。
そしたら、スレッドセーフにするため(?)に、Sessions変数のOpenSessionでオブジェクトを取得すればいいみたいですね。
この時、引数にセッション名を渡して、該当するセッションがあれば、そのセッションが返されて、該当セッションが見つからなければ、新しいセッションにその名前をつけて返してくれるらしい。
これが正しい使い方だったのか。
早速、パッケージを修正してから、サンプルプログラムを動かしたら、今度はエラーが出なくなった。
TSessionは基本的にはSessions変数からいただくものだったんですね。
ヤレヤレです。
ついでに見つけたんだが、borland\CBuilder6\source\vcl\Db.hppの1211行目あたりに、Currencyというプロパティがある。
TCurrencyFieldなんだが、TFloatFieldから派生している。
で、派生元クラスのTFloatFieldを見てみると、プロパティはcurrencyだ . . . 。
実際に、borland\cbuilder6\source\include\vcl\db.hppのTCurrencyField には小文字で書かれている。
C++では文字の大小を区別するので、これは別のプロパティとなる。
しかし、TCurrencyFieldでは、 __property Currency = {default=1}; と型もなく書かれていて、試しにちょっと工夫してこれをコンパイルしてみると、やはりここで、宣言エラーが不正だというエラーが出ますね。
で、先頭のCを小文字のcに変更してみました。
コンパイルも無事通りました。
うぅむ。
なんで、include\vcl\db.hppとsource\vcl\db.hppが違うのかは、勉強不足なのか全然わからん。
同じファイルのコピーじゃダメなんだろうか?
windowsなのでdiff見ないな物の手持ちもないので、比較はしていませんが実際どうなんでしょうね。
この頃はborlandだったもんな。
会社名がよく変わるツールだな。
インプライズになってボーランドに戻って、コードギアになってから、エンバカデロだもんな。
バージョンによってインストールされているディレクトリが全然違うから、戸惑うんだよな。
エンバカデロになってからバージョンアップしてないから、どんなもんだかわからないけど . . . 。
| 固定リンク
「C/C++」カテゴリの記事
- コンピュータプログラミング言語調節可能おしゃれキャップ(2018.06.05)
- raspberry piでC++11を使えるようにする(2016.04.27)
- StrinToIntのような文字列を整数に変換する関数を実装してみる(2016.03.21)
- インライン化できない関数のラッパー関数などで関数呼び出しのオーバーヘッドを減らしたい(2016.03.03)
- C++ Builder/Delphiでフォーカスが別のコントロールにある時に強引にTEditに入力を戻す(2014.09.15)
「Windows」カテゴリの記事
- .jfifを管理者にならずにレジストリ変更して.jpgに変更する。Windows10でJPEG画像をダウンロードする時に拡張子が.jfifになる(2020.08.22)
- ReadyBoostを設定してみた(2019.06.23)
- Apacheが起動しない could not bind to address 0.0.0.0:80(2018.06.01)
- 以前のバージョンのWindowsをコンピュータから削除して保存領域を広げる(2017.04.15)
- ASUS Smart Gestureが機能しなくなった場合(2016.07.15)
「Tools」カテゴリの記事
- 一晩でGoogle Home miniが英語しか話せなくなった(2017.12.09)
- スマホの充電器が壊れた(2017.11.30)
- SDカードとかUSBメモリのパーティションをクリーンアップ?してフォーマットする(2017.02.21)
- スマホのSDカードが破損した。復旧を試みる(2016.04.22)
- auスマホでMVNOにMNPしてみた(2015.11.30)
「CBuilder」カテゴリの記事
- 一定時間アイドル状態が続いたら何かをしたい(2015.11.26)
- TMetafileへの描画が反映されない(2015.07.30)
- TDataModuleはClientHeightプロパティを持っていない(2015.02.19)
- VCLのTStringsを検索キーワードのトークナイザー的に使ってみる(2014.12.18)
- Delphi/C++Builder TControl::ClientToScreenでVCLコントロール上の座標をスクリーン座標に変換する(2014.12.02)
この記事へのコメントは終了しました。
コメント