COBOLからDELPHI(DLL)を呼び出すには?


ない  2011-04-07 02:40:26  No: 40435

ここでの質問は場違いかも
知れませんが・・・、
質問させて下さい。

COBOLからDELPHI(DLL)を呼び出す
プログラムを作成中ですが、
全くできなくて困っていますので
何かあれば教えて頂けないでしょうか。

COBOL CALL
Delphi LIB作成?

サンプルソースが見当たらない・・・
というより、情報がないです。

COBOLでAAAをCALLすると、
プロシージャ エントリ ポイント"_AAA@4"が・・・。エラー
関数の作成方法もよく分かりません。


igy  2011-04-07 18:57:57  No: 40436

学生時代に少しだけ使った程度で、現在はまったくCOBOLを使っていないので、
ほとんどお役に立てませんが・・・

・そのCOBOLのマニュアルとかオンラインヘルプみたいなものに、
  DLL の呼び出しに関する情報はありますか?
・Googleなどで、
   COBOL DLL 呼び出し
  とかで検索したら、参考になる情報などありますか?


なかなか  2011-04-08 23:44:47  No: 40437

どのCOBOLを使われているのかわかりませんが、
私が昔使ってことのあるCOBOLでDLLを呼び出す場合は、
呼ばれるDLLの名前の先頭に_(アンダーバー)を付けておかないとダメ、
と言うルールがありました。ですから

CALL  "_AAA"  parm1,・・・・・.

となります。お使いのCOBOLのマニュアルにはDLL呼び出しの記述はないですか?。


Quest  2011-04-09 01:21:31  No: 40438

COBOLではありませんが、とある装置のドライバーDLLの関数名が
"_HogeHoge@4"の様にアンダーバーで始まり@数値で終わるというものがありました。
@の後の数値は、どうやら引数のバイト数を示しているようで(C++のルール?)
引数がintegerやポインターが1つの場合は"〜@4"、integer等が2つなら"〜@8"となっていました。
もし、ライブラリ(Delphi)側を自作しているなら、呼び出す関数名を
"_AAA@4"などにしてしまったらどうでしょう。


Null  2011-04-10 16:01:44  No: 40439

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.


Null  2011-04-10 16:08:15  No: 40440

追加。
ユーザーインターフェイスに、Dialog Systemを使っていましたが
その部分を削除しました。 その為、変数等にアンマッチな箇所があると思います
がそのあたりは、想像してください。


ない  2011-04-11 23:26:53  No: 40441

いろいろありがとうございます。
とりあえず
頂いた回答を参考に
チャレンジしてみようと思います。
その結果、報告させて頂きます。


ない  2011-04-13 18:48:35  No: 40442

途中結果とハマっている問題です。
あまり理解していないまま、
記載しているため、説明がおかしいところは
ご了承を。

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"の処理で落ちてしまう。
値渡しと参照渡しでは、方法が違うのでしょうか?


Quest  2011-04-13 22:50:30  No: 40443

COBOL側のDLL定義方法については知らないので何とも言えませんが
もしこのCOBOLでも引数のバイト数が付加されているなら
(FROM_COB:PChar)でも(var FROM_COB:PChar)でも引数は4バイトなので
DELPHI_DLL@4 @1
とするべきじゃないかと思います。
(引数の内容のサイズではなく、引数[変数]自体が占有するサイズです)

ちなみに
> DELPHI_DLL@8 @1
この"@1"は何を意味しているのでしょう?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加