起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 428|回复: 13

【结】.Net控件导入第三步出错**

[复制链接]
发表于 2008-3-6 10:01:46 | 显示全部楼层 |阅读模式
按照你们所提供的如何在X3中引入外部动态库与OCX控件的文档说明,.Net非控件动态链接库能比较简单的引入,而在引入控件动态链接库时,在第一步就出现了下面的错误提示:如图所示:
请问如何解决?谢谢!

未命名.jpg

129.89 KB, 下载次数: 206

回复

使用道具 举报

 楼主| 发表于 2008-3-8 10:26:09 | 显示全部楼层

.Net控件导入第三步出错

在导入.Net控件进行到第三步的时候出错,出错的提示为如图所示,参考了导入第三方控件的文档说明,一直找不出问题出在什么地方。附上源代码,麻烦帮我看看。谢谢!

未命名.jpg

43.51 KB, 下载次数: 211

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-8 10:27:30 | 显示全部楼层
源代码和文件:

controlsamples.rar

350.09 KB, 下载次数: 116

回复 支持 反对

使用道具 举报

发表于 2008-3-8 13:18:48 | 显示全部楼层
第四章 如何在X3中引入.Net控件
由于平台采用了自己的运行机,.Net控件不能直接在平台上使用,需要首先把.Net控件注册到注册表中,然后当作一个外部控件来调用,而且调用这个控件时候要求客户端必须安装.Net Framework。

以下有一个TestLib.dll的.net 类库,其中有一类:TestClass
请按照以下步骤来操作:
1.        在客户端注册.net控件
在命令行执行regasm TestLib.dll /codebase。注:安装了.Net Framework的机器在Framework目录下就有regasm.exe的程序
2.        在平台上,调用这个控件
X3平台上,通过DispatchHelper来调用这个控件的方法和属性
其中:
InvokeMethod        调用方法
PropertyGet        获取参数的值
PropertySet        设置参数的值
例如:下面代码是调用一个方法的写法。
var
  c: object;
  d: System.DispatchHelper;
begin
  c := ComObj.CreateOleObject('TestLib.TestClass');
  d := System.DispatchHelper.Create(a);
  retrunValue := d.InvokeMethod('methodName', [param1, param2 ... paramN]));
end;

注意:
1、.net 中的实现类的构造函数不能带参数。
2、只能传递简单类型,比如:int、long、double、string 等,传递数组参数时,需要声名为 object 类型,如下:
public class TestClass
{
        public int arrayTest(object a)
        {
                int[] b = (int[])a;
                return b[0] + b[1];
        }
}
回复 支持 反对

使用道具 举报

发表于 2008-3-8 13:24:31 | 显示全部楼层
ControlSamples.dll 是.net 控件,楼主是怎么生成 .tlb 文件的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-8 15:09:33 | 显示全部楼层
三楼所说的方法只是适用与非控件的.Net动态连接库,我已经实现了,对于控件的.Net动态连接库并不适合。
而ControlSamples.dll 是个控件动态连接库,是需要把它放入X3的工具箱中的,而不是像三楼那样进行调用。
对于ControlSamples.tlb 是在.Net中生成控件的时候vs2005自动生成的。
回复 支持 反对

使用道具 举报

发表于 2008-3-10 09:22:36 | 显示全部楼层
10.        第三步生成注册文件_reg.pas的时候,提示“Access violation at address 004BE4FC in module 'DelphiImporter.exe'. Read of address 00000000”
以下情况都会出现这个错误:
1)        .pas文件编译错误:请首先在Delphi中编译涉及的所有文件是否可以编译通过。
2)        包含了CLX的单元文件:请确认单元文件中没有包含CLX的单元。
3)        .pas文件中有编译指示near、far、export,去掉这些兼容性的编译指示。
4)        .pas文件中,有函数使用了缺省参数,请去掉缺省参数,然后才可以导入进来。

用这个tlb生成的文件,在Delphi中就编译不通过
[Error] mscorlib_TLB.pas(5191): Type 'Byte' is not yet completely defined
[Error] mscorlib_TLB.pas(5206): Type 'Double' is not yet completely defined
[Error] mscorlib_TLB.pas(5232): Type 'Int64' is not yet completely defined
[Error] mscorlib_TLB.pas(5264): Type 'Single' is not yet completely defined
[Error] mscorlib_TLB.pas(5744): Illegal type in OLE automation section: 'Byte'
[Error] mscorlib_TLB.pas(5751): Illegal type in OLE automation section: 'Single'
[Error] mscorlib_TLB.pas(5752): Illegal type in OLE automation section: 'Double'
[Error] mscorlib_TLB.pas(10871): Illegal type in OLE automation section: 'Byte'
[Error] mscorlib_TLB.pas(10878): Illegal type in OLE automation section: 'Single'
[Error] mscorlib_TLB.pas(10879): Illegal type in OLE automation section: 'Double'
[Fatal Error] ControlSamples_TLB.pas(35): Could not compile used unit '..\..\Business_3.0\Import\2323\ControlSample\mscorlib_TLB.pas'
回复 支持 反对

使用道具 举报

发表于 2008-3-10 09:28:53 | 显示全部楼层
而且生成的 ControlSamples_TLB.pas 文件中
没有定义TOleControl的控件,也没有定义Register函数
  TMyTextBox = class(TOleControl)
也不会出现在工具箱上
回复 支持 反对

使用道具 举报

发表于 2008-3-10 09:30:42 | 显示全部楼层
就算按照FAQ 5的做法
5.        第一步生成的类型声明文件没有Register函数
有些控件在创建包文件OCX的时候,没有正确的设置属性,这样的控件就不能够正常的生成类型声明文件。
可以在Delphi中,选择“File | Open”菜单,在弹出的Open对话框中选择“Type Library (*.tlb; *.dll; *.ocx; *.exe; *.olb)”,然后选择需要的控件文件;
在左面选择CoClass的对象,在右面选择flags页,确保“Can Create、Control”这两个选项是选中的,选择“File | Save as…”菜单项,取文件扩展名为.tlb,就会同时得到.tlb文件和_TLB.pas文件,用这个_TLB.pas文件继续后面的步骤。
生成了 TOleControl 控件
但是
  TMyTextBox = class(TOleControl)
  private
    FIntf: _MyTextBox;
    function  GetControlInterface: _MyTextBox;
  protected
    procedure CreateControl;
    procedure InitControlData; override;
  public
    property  ControlInterface: _MyTextBox read GetControlInterface;
    property  DefaultInterface: _MyTextBox read GetControlInterface;
  published
  end;
没有任何属性和方法公开出来啊,放到工具箱也没有什么作用,只是不用创建这个对象了,任何属性和方法的调用还是需要写代码来完成
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-10 11:05:15 | 显示全部楼层
问题太多了,都不知从何改起,你们有没有调用.Net控件的例子,而不是非控件的.Net动态链接库的例子。谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-8 17:03 , Processed in 0.045429 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表