Delphiで作成したDLLをMicrosoftのASPから利用しようとしています。
しかし、ASP側でインスタンスを生成しようとした時に、
「クラス文字列が無効です」というエラーになってしまいます。
そこで、レジストリへの登録を試みたのですが、
「c:\abc.dll は読み込まれましたが、DllRegisterServer エントリポイント
が見つかりませんでした。このファイルが登録されていない可能性があります。」
と怒られてしまいます。
Delphi の Win32プログラムからは同一のフォルダに入れておけば、正常に
呼び出せます。また、ASP からbasp21などのDLLは普通に呼び出せます。
たぶん、DLLの作り方が悪いのだとは思うのですが、なにぶん初心者なもので
解決できずにいます。
よろしければ、皆さまのお知恵を拝借させていただけないでしょうか?
意味不明の部分が多々あるかと思いますが、どうぞよろしくお願いいたします。
【環境】
WinXP Pro + IIS5.1
ASP は .NET以前のもの。スクリプトは VBScript。
Delphi は2005アーキテクトのトライアル版で、Win32のDLLウィザードで作成
【DLLのソース】ご参考まで。
library abc;
uses
SysUtils,
Classes;
{$R *.res}
// 関数
function getMasterStrings(strCode: Char):String;
var
strMString : string;
begin
case strCode of
'1' : strMString := 'ドロンジョ';
'2' : strMString := 'ボヤッキー';
'3' : strMString := 'トンズラー';
else
strMString := 'とりあえず、ドロンジョで。';
end;
Result := strMString;
end;
exports
getMasterStrings name 'get_ms';
begin
end.
DLLでDelphiのstringを返すことは出来ません。
以下のページ参考になりませんか。
https://www.petitmonte.com/bbs/answers?question_id=1978
kkkさん、お返事ありがとうございます。
で、初心者なものでちょっとよく分からないので、教えてください。
ご指摘いただいた内容が原因で、DLLのインスタンシングはできなくなる、
ということでしょうか?
それとも、私の疑問点とは別に、私がやろうとしていることには
ご指摘のような問題点を内包しているよ、ということでしょうか?
変な質問をしてしまい、申し訳ありません。
Delphiにおけるstringは独自のメモリ管理を行っています。
そのためVC,VB等のほかの言語では Delphiのstringを扱うことが出来ません。
またDLLの呼び出し元がDelphiで作成されたソフトであっても共用メモリマネージャである BORLNDMM.DLLを使用しなければなりません。
一般的には PCharかBSTR型(TBstr)を使用します。
追伸)
呼び出し規約も適切に設定してください。
stdcall/safecall/cdecl等があります。
詳しくはHelpを参照してください。
おはようございます。
ご回答ありがとうございます。
しかし、このエラーはそういう問題ではないと思うのですが。
ちなみにStringを使わないDLLも作ってみましたが
結果は同じです。
「クラス文字列が無効です」というのはDLLに足りない部分があるか、
インストールの仕方が間違っているとしか思えないのですが
違うのでしょうか?
クラスとして使用したいのであれば、ActiveX DLLで作成してみてはどうでしょう。
>ちなみにStringを使わないDLLも作ってみましたが結果は同じです。
動く・動かないい関係なく DLLでDelphiのstringを引数に使用するのは良くありません。
>「クラス文字列が無効です」というのはDLLに足りない部分があるか
というのは stringの使用とは全く関係がありません(別の要因です)。
オブジェクトとしてVBScriptから呼び出したいなら[にしの]さんのおっしゃるようにActiveX DLLを作成する必要があるでしょう。
これとは違うかな?
http://www.wwlnk.com/boheme/delphi/techdoc/dad0030.html
ツイート | ![]() |