Pregunta

Update: The problem was solved with the help of MathWorks. I've published the answer below.

I need to control a program (Zemax) from Matlab. Unfortunately, Zemax only supports DDE for such control, which Matlab does not support any more. It works, but stops working on 64 bit platform after a few (presumable 63) DDE calls.

I wonder if there are working solutions. I could probably program a DLL with correct DDE support and then use DDE in Matlab via this DLL. This is a major effort for me. A more suitable solution would be to use Java DDE methods. Following another post here, I've discovered the JDDE library. However I cannot make it work: Even if I am in the directory with the DLL and JAR files, executing

import pretty-tools.JDDE-2.0.3.*

works fine but calling

a = com.pretty_tools.dde.client.DDEClientConversation()

afterwards (as done here) results in

Undefined variable "com" or class "com.pretty_tools.dde.client.DDEClientConversation".

I have very limited writing privileges on my PC, so I have added the javaclasspath.txt file with the jar/dll location to the directory indicated by prefdir. The file looks like this:

C:\Users\xxxxxxxx\Documents\matlab toolbox\jdde\pretty-tools-JDDE-2.0.3.jar

Calling javaclasspath shows a long listing with the last lines being:

...
C:\Program Files\MATLAB\R2012b\java\jarext\webservices\ws_client_core\mw-service-client-core.jar
C:\Users\kkarapet\Documents\matlab toolbox\jdde\pretty-tools-JDDE-2.0.3.jar                     

DYNAMIC JAVA PATH

<empty>

So path seems to be set correctly. What am I doing wrong?

¿Fue útil?

Solución

With the help of MathWorks support, I've found the answer. Here is how to make JDDE work with Matlab 2012b, without admin privileges:

  1. Download and unpack JDDE files (DLLs and JAR) into some folder. Let's say it's $path-to-jdde$\.
  2. In Matlab, type prefdir. Open the resulting directory and create two files there, javaclasspath.txt and javalibrarypath.txt.
  3. In javaclasspath.txt, add $path-to-jdde$\pretty-tools-JDDE-2.0.3.jar.
  4. In javalibrarypath.txt, add $path-to-jdde$\.
  5. Restart Matlab.

Now call ddeConv = com.pretty_tools.dde.client.DDEClientConversation; and start using the created object as described in JavaDoc. E.g. to connect to Zemax, run Zemax and then in call ddeConv.connect('Zemax', 'abc').

Step 2 above can only be done starting Matlab version R2012b. With an older version, if you have the write rights on the Matlab installation directory, you should be able to replace step 2 by editing the files librarypath.txt and classpath.txt in $MATLABROOT$\toolbox\local. I could not verify it so if you confirm it please let me know in the comment below.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top