COM不能使用它所在的Exe中的某个窗体上的控件?(200分)

Z

zhfhe

Unregistered / Unconfirmed
GUEST, unregistred user!
在一个Exe工程文件中有一个主窗体和一个COMServer,在主窗体的事件中可以
创建COM Client和调用COMServer的方法,但在COMServer的方法中一调用主
窗体上的控件就报'Access violation at address 0040A782',不管是调用
主窗体控件的属性、方法还是窗体的方法都会报这个错,为什么?应该如何
让COM能使用它所在的Exe中的某个窗体上的控件?
另外:主窗体应该是一个进程,那么同一Exe中的COMServer是否也是一个进程
或者是一个线程?两者的地位如何?我想这可能跟上面的问题有关...
 
试试在程序中所有与主窗体等VCL的语句全部都加全。
例如Form1为主窗口,上面有Button1.
在程序中引用Button1使用Form1.Button1,不要使用button1.
例如:ShowMessage(Form1.Button1.Caption);
 
试试在程序中所有COMServer调用的过程与主窗体等VCL的语句全部采用下面方法:
例如Form1为主窗口,上面有Button1.
在程序中引用Button1使用Form1.Button1,不要使用button1.
例如:ShowMessage(Form1.Button1.Caption);
尽量不要使用Self,全部用Form1代替。
 
为证实我New了一个Application名字叫a ,窗体Form1上面仅仅放了一个Edit1
COMServer设为Aparment,名字叫aa,为Iaa创建了一个Method名字叫t,
在aaImpl.cpp中增加方法t的代码如下:
#include "unit1.cpp"
...
STDMETHODIMP TaaImpl::t()
{
Form1->Edit1->Text="ok";
//*****
return S_OK;
}
再在主窗体的Create事件中加入调用t方法代码:
#include "a_TLB.h"
...
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TCOMIaa aaa=Coaa::Create ();
aaa->t();
}
然后程序在运行到上面的*****处出错:报'Access violation at address
0040A782'应该能说明你的方法不可行吧?还有没有别的办法?
 
//Delphi下测试成功 COMServer是不是Com Object
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Project1_TLB;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
T:ITest;
begin
T:=coTest.Create;
T.Test;
end;

end.
 
我又在BCB4下测试成功!
 
COMServer是Automation Object,我刚刚也试了delphi确实可以
你能把CBuilder下的程序贴出来吗?
注意要加上:
STDMETHODIMP TaaImpl::t()
{
Form1->Edit1->Text="ok";
//*****
return S_OK;
}
谢谢
 
我现在用BCB4并且使用的是Automation Object,代码完全就安照的的方法。
本帖以前都是使用的COM Object. 如果你需要,我可以将程序发给你,包括
72kb的可执行程序!
 
呵呵,好啊,你打个zip包发给偶吧,谢谢。^-^
 
'Access violation at address 0040A782' 后面还有 read 什么地址了?
另外,前卫兄啊,他问你是哪里出错你怎么老是说这里成功那里成功的?
 
已经发出,请将测试结果告诉我! 谢谢
 
Pipi.因为我老是测试成功嘛! {B-)
 
zhfhe:
我的测试环境: Win98+Dell233+BCB4(Build 14.11) Update Pack 1.
 
偶的BCB4一编译你的Project2_TLB.h就报错:
#if !defined(__UTILCLS_H_VERSION) || (__UTILCLS_H_VERSION < 0x0102)
#error "This file requires a newer version of the header UTILCLS.H" /
"You need to apply an update/patch to your copy of C++Builder"
我的正版BCB4的版本号是:Enterprise 4(Build 14.4) (好象比你的版本还高?:-&amp;)
呵呵,可能我的错是因为Pack没下,你的Pack哪下的,告诉偶链接可以吗?谢谢?
 
肯定是去borland下啦
 
Pipi.告诉你一个高速下栽站点:
ftp://soft.hn.cninfo.net/download/develop/patch/BCB4EUP1.EXE
 
补丁我早就下了,现在是等bcb5了。
我一般不去那些网站下,都是去原装的网站下,
多转了几手的文件感染病毒的概率大一点
 
pack已经down了,但不是pack没装的问题。
当我看了沈前卫的程序后把
#include "Unit1.cpp"
改成:
#include "Unit1.h"
就可以了!!!!!
太让人困惑了!
chat* faint...
谢谢两位!
同时我还有一个大问题,请看URL:http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=162369
如果有BCB4下的COMServer回调到合适的Client的比http://www.techvanguards.com/更复杂的例子请寄到我的信箱,再次多谢!
 
顶部