[疑难] 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
也只好这样了...
Global site tag (gtag.js) - Google Analytics