digitalmars.D.learn - Calling a C++ Object from D
- David Eagen (12/12) Jan 24 2012 I'm trying to understand how to call a C++ library from D. Specifically,
- Dejan Lekic (4/4) Jan 24 2012 Unfortunately, you cant use C++ namespaces. More about
- Richard Webb (2/2) Jan 24 2012 I've never used the Windows update API, but isn't it a COM interface rat...
- Richard Webb (30/30) Jan 24 2012 How about something like this (using Juno):
- David Eagen (7/37) Jan 24 2012 Thank you very much. This works great.
- Zachary Lund (4/22) Jan 24 2012 From what I understand, the most reliable way currently is to
I'm trying to understand how to call a C++ library from D. Specifically, the Windows Update API. My goal is rather simple in that I want to detect whether there is a reboot pending for the system. To do that I need to call the ISystemInformation::RebootRequired property but I don't know how to do that in D. Information about the call is at http://msdn.microsoft.com/en-us/library/aa386098(v=vs.85).aspx. I have the C++ header and have successfully defined VARIANT_BOOL, VARIANT_TRUE, and VARIANT_FALSE. The last bit to do is to define the ISystemInterface object itself and the RebootRequired method. How do I do that? -Dave
Jan 24 2012
Unfortunately, you cant use C++ namespaces. More about interfacing to C++ here: http://www.dlang.org/cpp_interface.html . The easiest way to solve this is to write a C function that will glue your code with the C++ library.
Jan 24 2012
I've never used the Windows update API, but isn't it a COM interface rather than a C++ interface? You can call those directly from D.
Jan 24 2012
How about something like this (using Juno): /////////////////////// import juno.com.core, std.stdio; abstract final class SystemInformation { mixin(uuid("C01B9BA0-BEA7-41BA-B604-D0A36F469133")); mixin Interfaces!(ISystemInformation); } interface ISystemInformation : IDispatch { mixin(uuid("ade87bf7-7b56-4275-8fab-b9b0e591844b")); int get_OemHardwareSupportLink(wchar* retval); int get_RebootRequired(out VARIANT_BOOL retval); }; void main() { //auto systemInformation = coCreate!(ISystemInformation)(uuidof!(SystemInformation)); auto systemInformation = SystemInformation.coCreate!ISystemInformation; if (systemInformation !is null) { scope(exit) tryRelease(systemInformation); VARIANT_BOOL b; int result = systemInformation.get_RebootRequired(b); if (SUCCEEDED(result)) { writefln("Reboot Required: %s", b); } } } ///////////////////////
Jan 24 2012
On Tue, 24 Jan 2012 07:22:46 -0600, Richard Webb <webby beardmouse.org.uk> wrote:How about something like this (using Juno): /////////////////////// import juno.com.core, std.stdio; abstract final class SystemInformation { mixin(uuid("C01B9BA0-BEA7-41BA-B604-D0A36F469133")); mixin Interfaces!(ISystemInformation); } interface ISystemInformation : IDispatch { mixin(uuid("ade87bf7-7b56-4275-8fab-b9b0e591844b")); int get_OemHardwareSupportLink(wchar* retval); int get_RebootRequired(out VARIANT_BOOL retval); }; void main() { //auto systemInformation = coCreate!(ISystemInformation)(uuidof!(SystemInformation)); auto systemInformation = SystemInformation.coCreate!ISystemInformation; if (systemInformation !is null) { scope(exit) tryRelease(systemInformation); VARIANT_BOOL b; int result = systemInformation.get_RebootRequired(b); if (SUCCEEDED(result)) { writefln("Reboot Required: %s", b); } } } ///////////////////////Thank you very much. This works great. Yes, it turns out I was mistaken and this is COM and not C++. Juno definitely helps here. I cloned it from github and was glad to see that work had recently been done on Juno as well. -Dave
Jan 24 2012
On Tuesday, 24 January 2012 at 12:30:26 UTC, David Eagen wrote:I'm trying to understand how to call a C++ library from D. Specifically, the Windows Update API. My goal is rather simple in that I want to detect whether there is a reboot pending for the system. To do that I need to call the ISystemInformation::RebootRequired property but I don't know how to do that in D. Information about the call is at http://msdn.microsoft.com/en-us/library/aa386098(v=vs.85).aspx. I have the C++ header and have successfully defined VARIANT_BOOL, VARIANT_TRUE, and VARIANT_FALSE. The last bit to do is to define the ISystemInterface object itself and the RebootRequired method. How do I do that? -DaveFrom what I understand, the most reliable way currently is to wrap the C++ API in a C API and then call the C API from D. It's easy but time consuming and can't be generated currently.
Jan 24 2012