お世話になっております。s23です。
今回初めてDLLを使うため、過去の掲示板を見て試行錯誤しましたが、どうしても分かりませんでした。
初歩的な質問ですが、下記ののDLLの呼び出しを、Delphiでどのように書けば良いのか教えていただけないでしょうか。
因みに、私の開発環境はwindows10 pro 64bitで、Delphi 10.2を使っています。
よろしくお願いします。
DLLはC#で作成されたもので次のようになっています。
TCalculation.TCalc.TAnalayis(double[] GetValue)
Dll名:TCalculation
クラス:TCalc
関数:TAnalayis(double[] GetValue)
これを呼び出すために次のように書いてみました。
type
DataArray = array[0..31] of double;
procedure TAnalayis(var data:DataArray); stdcall; external 'TCalculation.dll' ;
↑この部分でエラーになってしまいます。
var
TData : DataArray;
procedure TForm1.Button2Click(Sender: TObject);
begin
TAnalayis(TData);//関数呼び出し
end;
実行すると、次のアプリケーションエラーが出てしまします。
モジュールの読み込み: netutils.dll. デバッグ情報なし. ベースアドレス: $6F460000. プロセス Project1.exe (12068)
C#でクラスをエクスポートした形のDLLはDelphiを含めネイティブな開発環境からは簡単には呼び出すことはできません。
と思ったら、"delphi .net framework dll"あたりをキーワードにして検索するといくつか参考になりそうな話があるようです。
RegAsmで登録したDLL上のクラスをCreateOleObjectで生成して呼び出すみたいです。
通りすがりさん、早速の回答ありがとうございました。
教えていただいた情報で色々と調べてみたのですが、私のスキルでは少々難しそうですね。
仕方がないので、DLLの作者に、「C# to C++ Converter」で作り直して貰うよう調整してみます。
ちなみにC++でクラスをエクスポートするようなDLLはDelphi(に限らずその開発環境以外で作られたもの全般)からは
直接呼び出すことができません。そういう意味ではC#のほうがましかも…?
お願いするなら一般的なWin32 APIのようなDLLに、というのがいいと思います。
C#で作成されたDLLは.netアセンブリですけど、COMエクスポートされた
ものなら普通に呼び出し可能です。
C#ソースがあるならCOMエクスポートすれば、CreateOleObjectで利用
できると思います。
以下の記事を見つけました。
参考にしてください。
http://www.84kure.com/blog/2014/07/17/c-c%E3%81%8B%E3%82%89c%E3%81%AEdll%E3%82%92%E5%91%BC%E3%81%B6%E6%96%B9%E6%B3%95/
リンク切れかもしれませんが、
Using a .NET Assembly via COM by Jim McKeeth
http://edn.embarcadero.com/article/32754
Internet Archiveにて上記が見れました。
https://web.archive.org/web/20180327064014/http://edn.embarcadero.com/article/32754
Novさん、情報ありがとうございました。
この方法が、一番労力をかけないでできると思いますので、DLL作成者に依頼してみます。
CreateOleObjectの使い方は、下記などを参考にしてみます。
http://mrxray.on.coocan.jp/Delphi/plSamples/400_Excel_CreateObject.htm
参考さん、情報ありがとうございました。
一通り見てみましたが、私は殆どPascal系しか使ったことがなく、Cは苦手というよりも読むことすらできません。
質問ですが、エクスポートしたCOMを使うのは、エクセルの関数を使うのと同じような方法で使うことはできないのでしょうか。
過去に同じ質問をされてる方がいますね。
https://www.petitmonte.com/bbs/answers?question_id=6789
C#でVBA向けの.NETライブラリ(COMコンポーネント)を作成するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/1064combycs/combycs.html
>Nov 2018/10/01(月) 00:08:56
>C#ソースがあるならCOMエクスポートすれば、CreateOleObjectで利用
>できると思います。
やってみました.
使用した Visual Studio がちょっと古いですが...
[ C# で作成した DLL を Delphi で使用 - COM 参照 ]
http://mrxray.on.coocan.jp/Delphi/Others/Usage_dotNETDll.htm
Mr.XRAYさん、ありがとうございました。
早速、この内容をDLLの作者に伝えて、改修をお願いしております。
質問ですが、私も動作を確認するため、ダウンロードしたファイルを使用して
・Delphi の IDE からタイプライブラリを取り込む
を実行してみましたが、「登録済みのタイプライブラリ」の「追加」で「csSimpleDLL.dll」を指定すると、「タイプライブラリ/DLLの読み込みエラーです」が表示されます。
これは、私のPC環境が.NET Framework 4.5 ではなく.NET Framework 4.7になっているからなのでしょうか?
因みに、私の環境では下記の手順を行っていません。
・C# で作成した DLL を COM 参照によって Delphi で使用する手順
・C# の DLL に COM インターフェイス用のコードを追加
・C# の DLL を COM 参照可能にする設定
・DLL を任意の場所に配置できるように厳密な名前を設定
・プロジェクトをビルドして DLL とタイプライブラリを作成
以上、よろしくお願いします。
>「追加」で「csSimpleDLL.dll」を指定すると、「タイプライブラリ/DLLの読み込みエラーです
タイプライブラリのファイルは csSimpleDLL.tlb です.
ただし,DLL に COM インターフェイス用のコードがない場合,
タイプライブラリの取り込みをしても意味ありません.
DLL を EXE と同じフォルダ内に置いて,その DLL をシステムに登録します.
DLL をシステムに登録するには .NETFramework に付属の RegAsm.exe を使用します.
DLL に厳密な名前の設定がない場合は,/codebase オプションは指定しないでください.
正常に動作しないことがあります.
[ 実行環境で使用するには RegAsm.exe で DLL を登録する ]
http://mrxray.on.coocan.jp/Delphi/Others/Usage_dotNETDll.htm#09
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe C:\000\DelphiProject\csSimpleDLL.dll
↑ は [RegAsm.exe が場所] [DLL がある場所] となっています.
共にフルパスで指定します.
上のコマンドは .NET Framework 4.0 / 4.5 の場合です.
.NET Framework 4.7 の場合は RegAsm.exe の場所が違かも知れません (未確認)
> ・C# の DLL に COM インターフェイス用のコードを追加
> ・C# の DLL を COM 参照可能にする設定
> ・DLL を任意の場所に配置できるように厳密な名前を設定
ダウンロードした ZIP 書庫内の DLL は上記の設定をして作成しています.
Mr.XRAYさん、ありがとうございます。
私の環境は.NET Framework 4.7でしたが、
[ 実行環境で使用するには RegAsm.exe で DLL を登録する ] で、
「型は正常に登録されました」となりました。
その次に、「Delphi の IDE からタイプライブラリを取り込む」で、
「登録済みのタイプライブラリ」の「追加」で「csSimpleDLL.tlb」を指定すると、
「OLEレジストリへのアクセスエラーです」の表示が出てしまいす。
まだ、何か間違っているのでしょうか?
Delphiを管理者で実行で起動したら、東特を完了することができました。
お騒がせして申し訳ありませんでした。