digitalmars.D - Strange fallout changing modules
- Sean Cavanaugh (28/28) Aug 10 2012 While working on project using COM I noticed that the win32 bindings
- Sean Cavanaugh (6/34) Aug 10 2012 I always leave out something important before hitting send:
While working on project using COM I noticed that the win32 bindings project declares its own version of IUnknown and all the classes in the project derive from this. So I set out to see the feasibility of modifying the win32 module to use std.c.windows.com.IUnknown. This was a bit of work as there are a duplicate redefinitions in the project for methods like CoInitialize, structs like GUID, aliases like IID etc, but fairly simple. In the end I had a handful (approximately 10) files that needed fixing. The fix was simple: add 'private import std.c.windows.com' to the top of each file generating symbol collisions, and replace the duplicate symbols the compiler was complaining about with an alias to the equivalent object in std.c.windows.com. The code compiles great, but now the weird thing: Before this change I had to compile 13 .d files out of the win32 module. After the change I had to add 37 others, and also suffer numerous import lib not found warnings because I am effectively compiling dead code that pragma includes lib's I don't need. Can anyone explain this behavioral change? Also, the more I work on this the more I wonder if D should also not allow any other IUnknown interfaces to be declared, that are not an alias to std.c.windows.com (or wherever each platform's canonical version lives). It makes it impossible to easily write a static assert in interface containers that emulate ATL's CComPtr: i.e. i have to write static assert(is(T : std.c.windows.com.IUnknown) || is(T : win32.unknwn.IUnknown)); instead of: static assert(is(T : std.c.windows.com.IUnknown)); and also hope nobody adds another one somewhere else.
Aug 10 2012
On 8/11/2012 1:50 AM, Sean Cavanaugh wrote:While working on project using COM I noticed that the win32 bindings project declares its own version of IUnknown and all the classes in the project derive from this. So I set out to see the feasibility of modifying the win32 module to use std.c.windows.com.IUnknown. This was a bit of work as there are a duplicate redefinitions in the project for methods like CoInitialize, structs like GUID, aliases like IID etc, but fairly simple. In the end I had a handful (approximately 10) files that needed fixing. The fix was simple: add 'private import std.c.windows.com' to the top of each file generating symbol collisions, and replace the duplicate symbols the compiler was complaining about with an alias to the equivalent object in std.c.windows.com. The code compiles great, but now the weird thing: Before this change I had to compile 13 .d files out of the win32 module. After the change I had to add 37 others, and also suffer numerous import lib not found warnings because I am effectively compiling dead code that pragma includes lib's I don't need. Can anyone explain this behavioral change? Also, the more I work on this the more I wonder if D should also not allow any other IUnknown interfaces to be declared, that are not an alias to std.c.windows.com (or wherever each platform's canonical version lives). It makes it impossible to easily write a static assert in interface containers that emulate ATL's CComPtr: i.e. i have to write static assert(is(T : std.c.windows.com.IUnknown) || is(T : win32.unknwn.IUnknown)); instead of: static assert(is(T : std.c.windows.com.IUnknown)); and also hope nobody adds another one somewhere else.I always leave out something important before hitting send: The reason I had to add the additional modules, was it was complaining about ModuleInfoZ's were missing for 5-10 modules (adding 1 sometimes added several new link errors). I ended up having to add 37 modules to get the project to link
Aug 10 2012