bin/dde_main in dde-0.2.2 vs bin/dde_main in dde-0.2.8
- old
+ new
@@ -2,106 +2,24 @@
lib = File.join(File.dirname(__FILE__), '..', 'lib')
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include? lib
require 'dde'
+require 'win/gui/message'
+include Win::DDE
+include Win::GUI::Message
+
# console output redirection (may need to wrap it in synchronization code, etc)
def cout *args
print *args
end
-cout "Starting script\n"
-
-require 'win/gui/message'
-
-include Win::GUI::Message
-include Win::DDE
-
-server = DDE::XlServer.new # create server
-
# std::queue<XlTable> q; // Queue contains the tables to output
-# HDDEDATA CALLBACK DdeCallback(UINT uType, UINT uFmt, HCONV hConv, HSZ hsz1, HSZ hsz2,
-# HDDEDATA hData, DWORD dwData1, DWORD dwData2)
-
-dde_callback = lambda do |type, format, conv, hsz1, hsz2, data_handle, data1, data2|
- case type
- when XTYP_CONNECT # Request to connect from client, creating data exchange channel
- # hsz1:: Handle to the topic name.
- # hsz2:: Handle to the service name.
- # dwData1:: Pointer to a CONVCONTEXT structure that contains context information for the conversation.
- # If the client is not a Dynamic Data Exchange Management Library (DDEML) application,
- # this parameter is 0.
- # dwData2:: Specifies whether the client is the same application instance as the server. If the
- # parameter is 1, the client is the same instance. If the parameter is 0, the client
- # is a different instance.
- # *Returns*:: A server callback function should return TRUE(1) to allow the client to establish a
- # conversation on the specified service name and topic name pair, or the function
- # should return FALSE to deny the conversation. If the callback function returns TRUE(1)
- # and a conversation is successfully established, the system passes the conversation
- # todo: handle to the server by issuing an XTYP_CONNECT_CONFIRM transaction to the server's
- # callback function (unless the server specified the CBF_SKIP_CONNECT_CONFIRMS flag
- # in the DdeInitialize function).
-
- if hsz2 == server.service.handle
- 1 # instead of true # Yes, this server supports requested (name) handle
- else
- cout "Unable to process connection request for #{hsz2}, service handle is #{server.service}\n"
- DDE_FNOTPROCESSED # 0 instead of false # No, server does not support requested (name) handle
- end
-
- when XTYP_POKE # Client initiated XTYP_POKE transaction to push unsolicited data to the server
- # format:: Specifies the format of the data sent from the server.
- # conv:: Handle to the conversation.
- # hsz1:: Handle to the topic name. (Excel: [topic]item ?!)
- # hsz2:: Handle to the item name.
- # data_handle:: Handle to the data that the client is sending to the server.
- # *Returns*:: A server callback function should return the DDE_FACK flag if it processes this
- # transaction, the DDE_FBUSY flag if it is too busy to process this transaction,
- # or the DDE_FNOTPROCESSED flag if it rejects this transaction.
- #
- # # CHAR buf[200];
-
- flag = server.table.get_data(data_handle) # extract client's DDE data into server's xltable
- if flag
- # Converting hsz1 into "[topic]item" string and
- server.table.topic_item = dde_query_string(server.id, hsz1)
- server.table.draw # Simply printing it for now, no queues
- # // Placing table into print queue
- # WaitForSingleObject(hMutex1,INFINITE);
- # q.push(server.xltable);
- # ReleaseMutex(hMutex1);
- # // Allowing the table output thread to start...
- # ReleaseSemaphore(hSemaphore,1,NULL);
- #
- cout "Transaction finished"
- DDE_FACK # Transaction successful
- else
- cout "Unable to receive dataprocess connection request for #{hsz2}, server handle is #{server.handle}\n"
- DDE_FNOTPROCESSED # 0 Transaction NOT successful - return (HDDEDATA)TRUE; ?!(why TRUE, not FALSE)
- end
-
- when XTYP_DISCONNECT # DDE client disconnects
- # server.xltable.Delete();
- # break;
- DDE_FNOTPROCESSED # 0 - return((HDDEDATA)NULL);// is it the same as 0 ?!
-
- when XTYP_ERROR # DDE Error
- # WaitForSingleObject(hMutex, INFINITE);
- # std::cerr<<"DDE error.\n";
- # ReleaseMutex(hMutex);
- # break;
- DDE_FNOTPROCESSED # 0 - return((HDDEDATA)NULL);// is it the same as 0 ?!
-
- else
- DDE_FNOTPROCESSED # 0 - return((HDDEDATA)NULL);// is it the same as 0 ?!
- end
-end
-
-# Staring service with default name 'excel'
-cout "Starting DDE service 'excel'\n"
-server.start_service &dde_callback
+# Creating DDE server and staring service with default name 'excel' and default callback
+cout "Starting DDE server with service 'excel'\n"
+server = DDE::XlServer.new.start_service
msg = Msg.new # pointer to Msg FFI struct
# Starting message loop (necessary for DDE processing)
cout "Starting message loop\n"
\ No newline at end of file