2012-07-25 64 views
1

Ubuntu我在OCaml的编码非常简单ml.ml呼叫OCaml中的可执行文件或C从VBA代码

let() = print_string "hello world, in OCaml\n" 

而且在C简单c.c

#include <stdio.h> 
main() { 
    printf("hello world, in C\n"); 
    return 0; } 

然后我编译它通过ocamlc -o mlexe.exe ml.mlgcc -o cexe.exe c.c。在Ubuntu的终端下启动mlexe.execexe.exe会返回字符串。

现在我想从VBA代码中调用它。我启动Windows,打开Microsoft Excel文件,和VBA编辑器,并提出:

Sub run() 
    Dim ProcID As Integer 
    ProcID = Shell("C:\Windows\system32\calc.exe", 1) 

    Dim Result As Variant 
    Result = Shell("C:\test\cexe.exe",1) 
    'Result = Shell("C:\test\mlexe.exe",1) 
    'Result = Shell("C:\test\cexe.exe") 
    'Result = Shell("C:\test\mlexe.exe") 
End Sub 

我希望Result得到字符串hello world...(或在一个不太好的情况下退出代码),运行宏不启动计算器,但给我一个错误Run-time error '5': Invalid procedure call or argument,其他4 Shell与我自己的可执行文件。

目标只是调用由VBA代码中另一种语言自己编译的可执行文件。

谁能告诉我什么是错?

+0

如果使用本地编译器'ocamlopt'而不是字节码编译器'ocamlc'来产生程序,会发生什么?我认为这可能会更简单。否则,由于'hello.exe'实际上是一个字节码文件,所以你可以尝试运行'ocamlrun.exe hello.exe' – 2012-07-25 18:48:49

+2

ocaml程序是否真的*返回*字符串或只是*打印*它?我想后者。 – phimuemue 2012-07-25 18:51:23

+0

@PascalCuoq:我尝试过'ocamlopt',并得到同样的错误。我尝试了'Result = Shell(“”“ocamlrun.exe”“C:\ test \ hello.exe”)',并且它返回'File not found'。 – SoftTimur 2012-07-25 19:03:32

回答

0

感谢您在评论中的回答。所以问题似乎是你有一个在Ubuntu下编译的可执行文件,在Windows下被称为可执行文件。 Windows可执行文件和Linux可执行文件不同,不能用于替代其他文件。

解决您的问题的最简单方法是在Windows下安装编译器,编译您的代码,从而获得Windows二进制文件。 对于OCaml,请参见http://protz.github.com/ocaml-installer/

另一种方式是对进行交叉编译,即在Linux下编译但明确要求编译器生成Windows可执行文件。这很难。

+0

非常感谢...我已经安装了它。在'cygwin'中,我可以做'ocamlc -o mlexe.exe ml.ml',这个'mlexe.exe'可以从VBA调用。我不确定在'cygwin'中编译(使用'makefile')有多复杂,但它已经是第一步了...... – SoftTimur 2012-07-26 18:17:24