On 08/03/2010 10:40 AM, Maik Wojcieszak wrote:
Hi,

I'm working on a port of a Delphi component to Lazarus. The component wraps a dll for Network Communication based on ASPLs Vortex Library but implementing a full set of "easy to use" mechanisms for "daily work problems".

The dll itself is written in C++ with a C like interface. It is multithreaded and uses callbacks for a lot of purposes.
The callback function/procedure is defined like
OK a "flattened" interface is necessary.

//#---------------------------------------------------------------------
//                     CALLBACK PROCEDURES
//#---------------------------------------------------------------------
procedure ExecuteCommandClb(tmlhandle : TML_COMMAND_HANDLE; pCBData : Pointer); cdecl;
begin
 //...
end;
Did you define cdecl specification both in C and in Pascal ? AFAIK, with M$ Studio this is "__declspec(dllexport)", I don't know what the GNU notation for this is.

You also can use STDCALL instead of cdecl on both sites. I seem to remember the GNU C notation is __STDCALL, but this might be wrong.


No matter what I do inside this procedure if I reach the end the assembler window is popping up in the debugger.
The Parameters seem to be correct.

pCBData is a Pointer to an object stored with the pointer to the callback. The procedure is used as a proxy to call
the real worker method of the object.
You can't use C++ objects in Pascal. You need to flatten the interface completely by explicitly communicating addresses of flat functions to do a callback. This can be quite complicated :(.

tmlhandle is also a Pointer, but to an object that is implemented in the dll.
Also pointers need to be "flat" and not point to C++ (or FPC) objects.

Of course a multithreaded DLL offers some even more advanced problems. I would do a test with a singlethreaded DLL just to test all aspects of the interface to your FPC project and activate the threads later.

It should be no problem if a thread in a DLL calls a callback to your Pascal project. (We do this with Delphi and a PJ-SIP DLL.) But of course such a callback can't do any "visual" LCL stuff (like writing to the screen). Here you need to store the information (e.g. in a FIFO done with a TThreadList) and use the mainthread to do the LCL based stuff.

-Michael


--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to