[疑难] xpcom.dll为何不能正常加载?
qiezi
2007-04-15
用模板也可以,语法就得改成:
auto ifile = componentManager.QueryInterface!(ILocalFile)(); |
|
qiezi
2007-04-15
extern(C++)吧,D里面是支持这个的,不过它里面和extern(Windows)好像没有区分。。有时间还是要给DMD打个补丁,提交给Walter,不然没办法用D写XPCOM组件。
|
|
h_rain
2007-04-15
可以使用别名+混入,会好看点吧
类型是唯一需要给定的,其他都有模板工具处理 |
|
h_rain
2007-04-15
qiezi 写道 extern(C++)吧,D里面是支持这个的,不过它里面和extern(Windows)好像没有区分。。有时间还是要给DMD打个补丁,提交给Walter,不然没办法用D写XPCOM组件。
问题是,接口模型是接口模型,调用约定是调用约定,应该是分开表示的东西,放在一起就会限制使用了。 以后再有其他调用约定的com模型怎么办? |
|
qiezi
2007-04-15
返回值风格包装成异常风格,用工具来生成就可以了,大概是这样的:
class ILocalFile : ISupports { // ... void InitWithPath(wchar[] path) { scope auto _path = new AString(path); nsresult result = inner.InitWithPath(cast(nsAString*)_path); checkExceptioN(result); // 把错误码转成异常 } private: nsILocalFile innter; } 其中要处理的部分有: 1、XPCOM字符串类型和D字符串转换 2、返回值和异常转换 3、返回值参数转换到返回值 4、接口类型参数转成包装类参数 5、属性的GetXXX/SetXXX转成D风格的2个XXX方法 6、其它一些辅助的类和方法。 要写一些代码,目前IDL转到其它接口的代码都没包含这种实现代码,所以要费些事,不过应该问题不大。 |
|
qiezi
2007-04-15
其实只要把现在的extern(Windows)里面的虚表偏移去掉就可以了,在IUnknown里面加一个空方法占一个指针。其它的都可以兼容了,只要是用C++实现的接口模型
|
|
h_rain
2007-04-15
qiezi 写道 其实只要把现在的extern(Windows)里面的虚表偏移去掉就可以了,在IUnknown里面加一个空方法占一个指针。其它的都可以兼容了,只要是用C++实现的接口模型
这倒是,而且实现起来也比较简单。 但这样不会引起D程序的二进制兼容问题吗? 这样还是需要DMD与std库必须统一啊,不过如果不涉及用D写组件,好像没问题... |
|
h_rain
2007-04-15
qiezi 写道 返回值风格包装成异常风格,用工具来生成就可以了,大概是这样的:
class ILocalFile : ISupports { // ... void InitWithPath(wchar[] path) { scope auto _path = new AString(path); nsresult result = inner.InitWithPath(cast(nsAString*)_path); checkExceptioN(result); // 把错误码转成异常 } private: nsILocalFile innter; } 其中要处理的部分有: 1、XPCOM字符串类型和D字符串转换 2、返回值和异常转换 3、返回值参数转换到返回值 4、接口类型参数转成包装类参数 5、属性的GetXXX/SetXXX转成D风格的2个XXX方法 6、其它一些辅助的类和方法。 要写一些代码,目前IDL转到其它接口的代码都没包含这种实现代码,所以要费些事,不过应该问题不大。 这样做正向使用是ok的,但用D写xpcom组件的时候,还是... |
|
qiezi
2007-04-15
D是兼容这个模型的,我现在还没看明白它在哪里加的这个偏移,先把IDL转换工具做好,能调用了再说,用D写XPCOM组件放到后面。
|
|
h_rain
2007-04-15
也只好这样了...
|