ここでの質問は場違いかも
知れませんが・・・、
質問させて下さい。
COBOLからDELPHI(DLL)を呼び出す
プログラムを作成中ですが、
全くできなくて困っていますので
何かあれば教えて頂けないでしょうか。
COBOL CALL
Delphi LIB作成?
サンプルソースが見当たらない・・・
というより、情報がないです。
COBOLでAAAをCALLすると、
プロシージャ エントリ ポイント"_AAA@4"が・・・。エラー
関数の作成方法もよく分かりません。
学生時代に少しだけ使った程度で、現在はまったくCOBOLを使っていないので、
ほとんどお役に立てませんが・・・
・そのCOBOLのマニュアルとかオンラインヘルプみたいなものに、
DLL の呼び出しに関する情報はありますか?
・Googleなどで、
COBOL DLL 呼び出し
とかで検索したら、参考になる情報などありますか?
どのCOBOLを使われているのかわかりませんが、
私が昔使ってことのあるCOBOLでDLLを呼び出す場合は、
呼ばれるDLLの名前の先頭に_(アンダーバー)を付けておかないとダメ、
と言うルールがありました。ですから
CALL "_AAA" parm1,・・・・・.
となります。お使いのCOBOLのマニュアルにはDLL呼び出しの記述はないですか?。
COBOLではありませんが、とある装置のドライバーDLLの関数名が
"_HogeHoge@4"の様にアンダーバーで始まり@数値で終わるというものがありました。
@の後の数値は、どうやら引数のバイト数を示しているようで(C++のルール?)
引数がintegerやポインターが1つの場合は"〜@4"、integer等が2つなら"〜@8"となっていました。
もし、ライブラリ(Delphi)側を自作しているなら、呼び出す関数名を
"_AAA@4"などにしてしまったらどうでしょう。
10数年前に、MF-COBOL V5.0Jで試験的に作ったPGからそれらしい所を
拾ってきました。 何かの参考になれば、と言うことで...
ちょっと長いですが、ご容赦を。
読みにくい事もお許しを。m(_ _)m
000010$set case defaultbyte"00"
000020
000030 IDENTIFICATION DIVISION.
000040 PROGRAM-ID. dll-call.
000050 ENVIRONMENT DIVISION.
000060 CONFIGURATION SECTION.
000070 SOURCE-COMPUTER.
000080 OBJECT-COMPUTER.
000090*--重要追加項目-----------------------------------------------*
000100 special-names.
000110* call-convention 74 is WINAPI.
000120*-------------------------------------------------------------*
000130
000140 WORKING-STORAGE SECTION.
000170
000220 01 dll-max pic s9(09) comp-5.
000230 01 dll-min pic s9(09) comp-5.
000240 01 ret-FLAG PIC S9(09) COMP-5.
01 kotae pic s9(09) comp-5.
000310 01 minmax PROCEDURE-POINTER.
procedure division.
001570 SET minmax TO ENTRY "minmax.dll".
000370 max-call.
move 356 to dll-max.
000380 move 123 to dll-min.
000390
000400 CALL "Max" using
000410 by value dll-max
000420 by value dll-min
000430 returning ret-flag.
000440
move ret-flag to kotae.
display kotae at 0101.
000460
000480 min-call.
move 356 to dll-max.
000380 move 123 to dll-min.
000500
000510 CALL "Min" using
000520 by value dll-max
000530 by value dll-min
000540 returning ret-flag.
move ret-flag to kotae.
display kotae at 0201.
40 *-----------------------------------
000650 exit-prog.
000660 EXIT PROGRAM.
000670 STOP RUN.
********************** 以上 COBOL *********************
********************** 以下 Delphi *********************
library minmax;
uses
SysUtils,
Classes,
// Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
function Min(X,Y:Integer):Integer;stdcall;
begin
if X < Y then Min := X else Min := Y;
end;
function Max(X,Y:Integer):Integer;stdcall;
begin
if X > Y then Max :=X else Max := Y;
end;
exports
Min,
Max;
begin
end.
追加。
ユーザーインターフェイスに、Dialog Systemを使っていましたが
その部分を削除しました。 その為、変数等にアンマッチな箇所があると思います
がそのあたりは、想像してください。
いろいろありがとうございます。
とりあえず
頂いた回答を参考に
チャレンジしてみようと思います。
その結果、報告させて頂きます。
途中結果とハマっている問題です。
あまり理解していないまま、
記載しているため、説明がおかしいところは
ご了承を。
Quest様のコメントより
"引数がintegerやポインターが1つの場合は"〜@4"、integer等が2つなら"〜@8"となっていました。"
@以降の数字が4の倍数となっていました。
DelphiのDLLを使用するために(イマイチ理解していませんが)
COBOLのコンパイル時に、"DELPHI_DLL.LIB"を用いました。
「DELPHI_DLL.DEF」
LIBRARY DELPHI_DLL
EXPORTS
DELPHI_DLL@8 @1
コマンドプロンプトより、下記コマンド実行
lib /def:"DELPHI_DLL.DEF" /out:"DELPHI_DLL.LIB"
で、実際のCOBOLとDelphiは、下記の通り
(COBOL)
01 LEVEL1.
03 LEVEL3.
05 LEVEL5_1 PIC X(8).
05 LEVEL5_2 PIC X(8).
INITIALIZE LEVEL1
MOVE 'FROM_COB1' TO LEVEL5_1
MOVE 'FROM_COB2' TO LEVEL5_2
CALL 'DELPHI_DLL' USING LEVEL1.
(Delphi)「DELPHI_DLL」
function FUN1(FROM_COB:PChar):PChar;stdcall;
var
str_FROM_COB
begin
str_FROM_COB := FROM_COB;
"str_FROM_COB"には、'FROM_COB1FROM_COB2'と入っている
(Delphi)「DELPHI_DLL」(上記うまくいったため"var"を追加し)
function FUN2(var FROM_COB:PChar):PChar;stdcall;
var
str_FROM_COB
begin
str_FROM_COB := FROM_COB;
"str_FROM_COB"の処理で落ちてしまう。
値渡しと参照渡しでは、方法が違うのでしょうか?
COBOL側のDLL定義方法については知らないので何とも言えませんが
もしこのCOBOLでも引数のバイト数が付加されているなら
(FROM_COB:PChar)でも(var FROM_COB:PChar)でも引数は4バイトなので
DELPHI_DLL@4 @1
とするべきじゃないかと思います。
(引数の内容のサイズではなく、引数[変数]自体が占有するサイズです)
ちなみに
> DELPHI_DLL@8 @1
この"@1"は何を意味しているのでしょう?
ツイート | ![]() |