2012-07-25 37 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