Примечание: это догадка , поскольку я не проверял это, но для большинства реализаций COBOL есть библиотека времени выполнения (которая должна быть целью для dlopen
/ LoadLibrary
), которая предоставляет функции
Быстрый поиск в документации Micro Focus показал C Функции для вызова COBOL , вы, вероятно, захотите использовать cobinit()
, cobcall()
и cobtidy()
.
Поскольку все, что касается частей COBOL, выполняется библиотекой времени выполнения (которая должна быть либо связана, либо загружена сама), вам необходимо установить параметры, например, где найти модули и другие, возможно, соответствующиенастройки до вызова cobinit()
.
Возможно, понадобится одна настройка: COBPATH
- Если модули COBOL не находятся в текущем каталоге процесса * -установить так же, как и переменную PATH (записи, разделенные ";" в Windows)
В этом случае я бы попробовал что-то подобное (в C #, образец был C ++)
System.Environment.SetEnvironmentVariable("COBPATH", "X:\path;Y:\other-path");
Согласно документамИнформация о Вызов программ комбинированные программы загружаются путем загрузки библиотеки, содержащей их, сначала простым CALL
.Ваша настроенная программа будет выглядеть следующим образом:
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "cobtypes.h"
typedef int(__stdcall *f_cobinit)();
typedef cobrtncode_t(__stdcall *f_cobcall)(const cobchar_t *callname, int argcnt, cobchar_t **argvec);
int main()
{
HINSTANCE dllCbl = NULL;
f_cobinit cobInit = NULL;
f_cobcall cobCall = NULL;
int retCode;
printf("load COBOL runtime : ");
HINSTANCE dllCbl = LoadLibrary("cblrtsm.dll");
if (!dllCbl) {
retCode = (int)GetLastError();
printf("failure: %d\n", retCode);
return retCode;
}
puts("success");
printf("lookup COBOL functions : ");
cobInit = (f_cobinit)GetProcAddress(dllCbl, "cobinit");
cobCall = (f_cobcall)GetProcAddress(dllCbl, "cobcall");
printf("init: %p, call: %p - ", (void *)cobInit, (void *)cobCall);
if (!cobInit || !cobCall) {
retCode = (int)GetLastError();
printf("failure: %d\n", retCode);
return retCode;
}
puts("success");
printf("cobinit : ");
retCode = cobInit();
if (retCode) {
printf("failure: %d\n", retCode);
return retCode;
}
puts("success");
printf("preload CobolDlls : ");
retCode = cobCall((cobchar_t*)"CobolDlls", 0, NULL);
puts("success");
//printf("preload CobolDlls2 : ");
//retCode = cobCall((cobchar_t*)"CobolDlls2", 0, NULL);
//puts("success");
printf("do actual CALL "P2" : ");
retCode = cobCall((cobchar_t*)"P2", 0, NULL);
printf("returned with: %d\n", retCode);
getchar();
}
Примечание. Помните, что среда выполнения COBOL может выдавать exit
(особенно, если в деталях COBOL имеются ошибки или модуль STOP RUN
).Вы хотите быть в состоянии поймать его.