DDE Execute

Приведенный ниже пример посылает команду на DDE сервер. В качестве DDE сервера можно использовать наш пример.

final String SERVICE = "MyServer";
final String TOPIC = "MyTopic";

try
{
    final DDEClientConversation conversation = new DDEClientConversation();
    // We can use UNICODE format if server prefers it
    //conversation.setTextFormat(ClipboardFormat.CF_UNICODETEXT);

    System.out.println("Connecting...");
    conversation.connect(SERVICE, TOPIC);

    System.out.println("Please, enter commands or 'exit' to quit");
    try
    {
        byte[] buff = new byte[1024];
        int ret_read = 0;
        do
        {
            ret_read = System.in.read(buff);
            if (ret_read > 0)
            {
                String data = new String(buff, 0, ret_read);
                data = data.trim();

                if (data.equals("exit"))
                    break;

                System.out.println("Sending:" + data);
                conversation.execute(data);
            }
        }
        while ((ret_read > 0));
    }
    finally
    {
        conversation.disconnect();
    }
}
catch (DDEMLException e)
{
    System.out.println("DDEMLException: 0x" + Integer.toHexString(e.getErrorCode()) + " " + e.getMessage());
}
catch (DDEException e)
{
    System.out.println("DDEClientException: " + e.getMessage());
}
catch (Exception e)
{
    System.out.println("Exception: " + e);
}

Скачать ExecuteExample.java
Скачать все примеры и библиотеку

Запуск примера из консоли:

java -cp .;pretty-tools-JDDE-2.0.4.jar ExecuteExample
		

Почему моя команда не выполняется DDE сервером ?

Иногда при использовании сторонних программ в качестве DDE сервера, она попросту игнорирует команды или возвращает ошибки, так почему же это происходит ? Ответ кроется в реализации DDE сервера, который не может правильно определить формат данных, т.к. информация о формате данных не предоставляется для XTYP_EXECUTE транзакции.

Если вы точно не знаете ожидаемый формат данных, то вам нужно его угадать, попробовав один из вариантов ниже:
1. Попробуйте команду в ASCII формате (но скорее всего вы уже попробовали)

final DDEClientConversation conversation = new DDEClientConversation();
conversation.connect(SERVICE, TOPIC);
conversation.execute("my command");
2. Попробуйте послать команду в юникоде
final DDEClientConversation conversation = new DDEClientConversation();
conversation.setTextFormat(ClipboardFormat.CF_UNICODETEXT);
conversation.connect(SERVICE, TOPIC);
conversation.execute("my command"); 
3. Попробуйте послать команду в виде массива байтов
final DDEClientConversation conversation = new DDEClientConversation();
conversation.connect(SERVICE, TOPIC);
conversation.execute("my command".getBytes(/*можно попробовать так же разные кодировки*/));