ちょっくらDelphiでXMLRPCをごにょごにょするアプリを作っているのだけれど、その際のメモ。
Indyを使ってBASIC認証を通過させたいとき、リクエストURLを変えてhttp://id:password@hostではNGで、Indyのプロパティを設定してあげる必要がある。
Session := TIdHttp.
Create(nil);
try
Session.
Request.
Clear;
Session.
Request.
BasicAuthentication :=
True;
if Session.Request.Authentication = nil
then begin
Session.Request.Username := 'hoge';
Session.Request.Password := 'fuga';
end else
begin
Session.Request.Authentication.Username := 'hoge';
Session.Request.Authentication.Password := 'fuga';
end;
Session.Get('http://192.168.1.129');
finally
Session.Free;
end;
XML-RPCを使ってごにょごにょするためにDelphi5を使ってWindowsソフト作ろうとしていたんだよ。
#いまさらDelphi5なのは、さておき。
XML-RPCなんて自前で処理書くのバカバカしいから、コンポーネント探してみて、Delphi XML-RPCってのみつけて早速試してみたんだけど、コンパイル通らない・・・。調べてみたら、
IInterface
- COMを使用しない場合のインターフェース
- Delphi 6 で導入された
そういうことか。ということで、IInterfaceをIUnknownに書き換えて・・・以下のように修正
sourceフォルダにVariants.pasを作成する。中身は雛形の通りで良い。
unit Variants;
interface
implementation
end.
その他は3ファイル。BuildXmlRpcLib.dprとXmlRpcTypes.pasとXmlRpcServer.pasを下記のdiffの通り修正する。
基本的には、IInterfaceとIUnknownにすることと、StrToBoolがDelphi5には無いので適当に実装を追加するってことくらい。
Index: lib/dxmlrpc-2.0.0/build/BuildXmlRpcLib.dpr
===================================================================
--- lib/dxmlrpc-2.0.0/build/BuildXmlRpcLib.dpr (リビジョン 49)
+++ lib/dxmlrpc-2.0.0/build/BuildXmlRpcLib.dpr (リビジョン 50)
@@ -10,5 +10,6 @@
XmlRpcTypes in '..sourceXmlRpcTypes.pas',
XmlRpcCommon in '..sourceXmlRpcCommon.pas',
- XmlRpcServer in '..sourceXmlRpcServer.pas';
+ XmlRpcServer in '..sourceXmlRpcServer.pas',
+ Variants in '..sourceVariants.pas';
begin
Index: lib/dxmlrpc-2.0.0/source/XmlRpcTypes.pas
===================================================================
--- lib/dxmlrpc-2.0.0/source/XmlRpcTypes.pas (リビジョン 49)
+++ lib/dxmlrpc-2.0.0/source/XmlRpcTypes.pas (リビジョン 50)
@@ -36,5 +36,5 @@
uses
- SysUtils, Classes, Contnrs, DIMime, XmlRpcCommon;
+ SysUtils, Classes, Contnrs, DIMime, XmlRpcCommon, ActiveX, ComObj;
type
@@ -45,5 +45,5 @@
dtStruct, dtArray, dtError, dtNone, dtName, dtValue);
- IRpcCustomItem = interface(IInterface)
+ IRpcCustomItem = interface(IUnknown)
['{3441C47B-364D-4BE6-834E-E05C4FCAE9A6}']
function GetAsRawString: string;
@@ -196,5 +196,5 @@
end;
- IRpcCustomArray = interface(IInterface)
+ IRpcCustomArray = interface(IUnknown)
['{8177A796-7C3B-4C01-901C-88A13DA61F85}']
function GetItems(Index: Integer): TRpcArrayItem;
@@ -259,5 +259,5 @@
end;
- IRpcStruct = interface(IInterface)
+ IRpcStruct = interface(IUnknown)
['{7527E27A-6B61-41D6-9546-93DC816D8285}']
function InternalAddItem(const Key: string): TRpcStructItem;
@@ -372,5 +372,8 @@
TRpcReturn = TRpcFunction;
+ function strtobool(value : string) : Boolean;
+
implementation
+
{
@@ -839,4 +842,17 @@
end;
+function strToBool(value : String) : Boolean;
+begin
+ if lowercase(value) = 'true' then
+ begin
+ result := true; exit;
+ end;
+ if strtointdef(value, 0) = 1 then
+ begin
+ result := true;
+ exit;
+ end;
+ result := false;
+end;
{
Index: lib/dxmlrpc-2.0.0/source/XmlRpcServer.pas
===================================================================
--- lib/dxmlrpc-2.0.0/source/XmlRpcServer.pas (リビジョン 49)
+++ lib/dxmlrpc-2.0.0/source/XmlRpcServer.pas (リビジョン 50)
@@ -335,5 +335,5 @@
// FMethodList := TList.Create; Take TObjectList instead of TList;
FMethodList := TObjectList.Create;
- FMethodList.OwnsObjects := True;
+ //FMethodList.OwnsObjects := True;
FLock := TCriticalSection.Create;
end;
これで動作するようになった。
IHTMLElementCollectionから、特定のFormオブジェクトを取得するには、item関数を利用するのだが、この際、実は引数の渡し方は複数ある。
Form := Forms.item('form1', 0) as IHTMLFormElement;
上記は、要素名がauthと呼ばれる要素のうち一番最初のformを取得する。この場合は第一引数に要素名、第二引数にindex値を指定する。
Form := Forms.item(1, 1) as IHTMLFormElement;
上記はformの中で、二番目のformを取得する。この場合は、第一引数と第二引数に共に、IHTMLElementCollectionのindex値を指定する。
参考
http://msdn2.microsoft.com/en-us/library/aa703930.aspx
Delphiの話。
色々あって起動中のブラウザで表示中の画面を横取りして、formの項目をfillinしてPOSTしないといけない要件がある。まずはWindowハンドルを元にして、起動中のIEのIWebBrowser2インタフェイスを取得する方法。
function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
hInst: HWND;
lRes: Cardinal;
Msg: Integer;
pDoc: IHTMLDocument2;
ObjectFromLresult: TObjectFromLresult;
begin
hInst := LoadLibrary('Oleacc.dll');
@ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
if @ObjectFromLresult <> nil then
begin
try
Msg := RegisterWindowMessage('WM_HTML_GETOBJECT');
SendMessageTimeOut(WHandle, Msg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
if Result = S_OK then
(pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp,
IWebbrowser2, IE);
finally
FreeLibrary(hInst);
end;
end;
end;
これでIWebBrowser2のインタフェイスが取得できれば、文書の操作は簡単。
doc := IE.Document as IHtmlDocument2;
ShowMessage(doc.body.innerHTML);
ブラウザからIHtmlDocument2インタフェイスを取得し、それを通じてhtmlの本体にアクセスできる。

DelphiComponentListerは、あまり人の役に立たない簡単なツール。
Delphi製のアプリケーション(C++Builderもいけると思う)で利用しているコンポーネントの一覧を抽出してくれるツールである。
色々な野良コンポーネントを導入していると、ビルドに必要か必要でないのかの判断が付かなくなってしまうので、利用しているコンポーネントの一覧作成が必要だったのが作成動機。作成時間は60分。
ローカルにおいておくとなくすのでこちらにアップしておく。
単なるメモ。とあるソフトがイベントログを監視しているらしいのでその対応。
var
Eventlog : TEventLogger;
str : string;
eventType : Integer;
category : Integer;
id : Integer;
source : string;
begin
source := 'Security';
str := 'セキュリティのカテゴリに監査成功を突っ込む';
eventType := Windows.EVENTLOG_AUDIT_SUCCESS;
category := 0;
id := 538;
Eventlog := TEventLogger.Create(source);
try
EventLog.LogMessage(str,eventType, category, id);
finally
Eventlog.Free;
end;
end;
なお,usesにSvcMgrを追加しておく必要がある。
Delphiの良いところはコンポーネントが豊富なこと、ってことで色々見つけては試しているが、今日見つけたこれはなかなか良い。
ぷれぷれ電光掲示板
その名の通り文字列を電光掲示板方式で表示するコンポーネント。
ベータテストが開始してしばらくたつが、DB周りのエラー報告はなかなか出てこない。Nさんからは初期化して登録したらエラーが出るって連絡あるけど、ほかでは出ていないようだ。気持ち悪い。
でこのまま一般公開するとマズイかと思ってさらってみたら、理由がわかった。
原因はテーブル生成時のBDEの設定の問題で、Paradoxのテーブルサイズの制限は
ブロックサイズ*65535
なのだそうだ。そういえば昔はまったかも。
ということでブロックサイズはデフォルトでは2048なので
2048*65535/1024/1024=約127M
こりゃだめだ。
ということで早急に対策モジュールを作成。
自宅のDell Inspironでテスト。最近XPのSP2を適用してからマシンが突然死するようになって夜間放置すると朝にはきっちりw電源が落ちている。
ネットで検索したらノートPCの下に足をつけて通気性を向上させると解決するかも、とのことなので実験。
朝起きたらとりあえず正常に動作していた。
なんだかなぁ。
DelphiでMDIフォームのWindowメニューが消える
ので悩んでいたが、WindowMenu に指定するMenuItem に分割線を入れないようすればいいらしい。
Delphi5もいい加減バージョンアップすっかな。
最近またDelphiを触っている。
今の会社に転職する前はパッケージソフトの構築をしていてDelphiを良く触っていたんだけど、Web系のシステム構築が多くなっからぜんぜん触っていなかったので約5年ぶりくらい。久々に昔のソースコード見てみたら、コメントに1998年とか1999年とか書いてある。この世界で考えたら浦島太郎なコードだよw。んで内容を見るとあまりにレベルが低い。オブジェクト指向言語を何故名前のCみたいに書いてたんだ?>俺
自分では気づかないうちに成長してるみたい。
そういうもんかにぃ。
今日のキーワード
SQLite
→Delphiでも使えるオプソなDB
GEXPERTS
→DelphiのIDE用の便利ツール
« 前の記事
日記
PHP
オープンソース
インストールマニアックス
IIS
Trac
MySQL
Perl
Linux
Agile・生産性向上
wordpress
フリーソフト
自宅サーバ
書評
ブックマーク
phpMyFaq
TraM
Plugin
早起き
Delphi
apache
CakePHP
Firefox
Ruby
eclipse
セキュリティ
プラグイン
アジャイル
mojavi
Subversion
Ajax/Web2.0
SQLServer
Zope
サーバ
フレームワーク
phpBB
仮想化
PostgreSQL
OpenVZ
scuttle
CMS
文字化け
自宅
翻訳・日本語化
ApacheDS
LDAP
Excel
生産性向上
CodeIgniter
XAMPP
hacks
taskfreak
修正
言語ファイル
Ajax
SBM
ダウンロード
HTML::FillInForm
mod_security
情報共有