关于用delphi做activex dll 的问题(50分)

  • 主题发起人 主题发起人 xxp1978
  • 开始时间 开始时间
X

xxp1978

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手一个最基本的问题
就是做activex dll
我先建立了一个activex libary
然后加入了一个com objiect 在里面建了一个f1function的类,并添加了几个方法。
用f1book6 调用就是找不到函数名
请问各位,如何做才能被外面的程序调用dll中的函数
怎么做activex dll
有谁能给个过程
或源代码啊
 
这个我会试试
请关注http://hup2000.yeah.net
 
这个问题的代码在我家里,不过好像就是那么回事啊,难道不通。我在VB里调用过
库中自定义的方法,很好使啊,不过记录类型的属性好像不能保存值。
 
原来代码基础上删除了一些,所以可能编译的时候也许会有一些小问题.
library F1AddIn;

uses
ComServ,
F1AddInUnit in 'F1AddInUnit.pas';

exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer,
F1AddInInit;
begin
end.

unit F1AddInUnit;

interface
uses windows,dialogs,Sysutils,TTF160_TLB;

const
F1_E_NULL = $0040001
// #NULL!
F1_E_DIVZERO = $0040002
// #DIV/0!
F1_E_VALUE = $0040003
// #VALUE!
F1_E_REF = $0040004
// #REF!
F1_E_NAME = $0040005
// #NAME?
F1_E_NUM = $0040006
// #NUM!
F1_E_NA = $0040007
// #N/A

type
TOleVariantArray=array of Variant;
pOleVariantArray=TOleVariantArray;

TF1ADDIN_FUNCTION = function(var pResult: OleVariant;
nReserved: Integer;
nArgs: Integer;
pArgs: pOleVariantArray): HRESULT stdcall;

TF1AddInRegisterFunctionProc = function(pwszName: LPCWSTR;
nReserved: Integer;
pFunction: TF1ADDIN_FUNCTION;
nArgs: Integer): HRESULT stdcall;
TF1AddINRegisterInfoProc = function(pwszName,pwszDescription: LPCWSTR;
nReserved1,nReserved2: Integer): HRESULT stdcall;

function MakeErrorResult(var pResult: OleVariant
hrEval: HRESULT = S_OK): HRESULT;
function F1AddInInit(RegisterInfoProc: TF1AddInRegisterInfoProc;
RegisterFunctionProc: TF1AddInRegisterFunctionProc;
nReserved1,nReserved2: Integer): HRESULT stdcall;
function MyAdd(var pResult: OleVariant;
nReserved: Integer;
nArgs: Integer;
pArgs: pOleVariantArray): HRESULT
stdcall;

implementation
{$M+}
{$TYPEINFO ON}

function F1AddInInit(RegisterInfoProc: TF1AddInRegisterInfoProc;
RegisterFunctionProc: TF1AddInRegisterFunctionProc;
nReserved1,nReserved2: Integer): HRESULT stdcall;
var
hr: HRESULT;
begin
hr := S_OK;
if SUCCEEDED(hr) then
hr := RegisterFunctionProc('MyAdd',0,MyAdd,2);
if (SUCCEEDED(hr)) then
hr := RegisterInfoProc('Delphi F1book Add_In','',0,0);

Result := hr;
end;

function CheckReturnValue(hr: HRESULT): HRESULT;
begin
if FAILED(hr) then
Result := E_OUTOFMEMORY
else
Result := S_OK;
end;

function MyAdd(var pResult: OleVariant;
nReserved: Integer;
nArgs: Integer;
pArgs: pOleVariantArray): HRESULT
stdcall;
begin
if nArgs = 2 then begin
if (TvarData(pArgs[0]).VType = varDouble) and (TvarData(pArgs[1]).VType = varDouble) then begin
pResult := TvarData(pArgs[0]).VDouble + TvarData(pArgs[1]).VDouble;
Result := S_OK;
Exit;
end;
end;
Result := MakeErrorResult(pResult, F1_E_VALUE);
end;


function MakeErrorResult(var pResult: OleVariant
hrEval: HRESULT = S_OK): HRESULT;
begin
if hrEval <> S_OK then begin
varClear(pResult);
TvarData(pResult).vType := varError;
TvarData(pResult).vError := hrEval;
end;
Result := S_OK;
end;

 
晕ing
可不可以给点实现过程
需要那些步骤之类的
和各个步骤的注意点之类的问题
象个教学样子的文章也可以拉
(你好象用了comobject 包含typelibary)
就是那种在可视环境下该怎么做拉(恕小弟愚笨)
 
由于每一个ActiveX控件至少都有几个输出函数:
DllRegisterServer
DllUnregisterServer
DllGetCanUnloadNow
DllGetClassObject

在delphi中可以这样生成.
1.创建一个ActiveX library工程
打开Delphi编辑器,选择选单中的File/New,在New Item中选择 the ActiveX 项中的
ActiveX Library选项,Delphi将自动生成以下代码:

library Project1;
uses
ComServ;
exports

DllGetClassObject
DllCanUnloadNow
DllRegisterServer
DllUnregisterServer;

{$R *.RES}
begin
end.

DllGetClassObject函数负责将输入调用从COM库转换到相应的类工厂中;
DllCanUnloadNow函数是通知OLE引擎如果没有程序引用将自动释放内存;
DllRegisterServer与DllUnregisterServer函数用来登记COM服务器。
至于另一个输出F1AddInInit你就看F1Book的帮助手册,上面有规定.

用comobject,在上面这个例子中是不需要的,是我的疏忽,没有删去.
关于F1AddInUnit.pas的编写没有什么可说的,只有按照F1Book的帮助里要求的写了.
你如果真的想用delphi写F1Book的Add-In,我建议你先把F1Book的一个VC demo看几遍,
上面的代码的结构也是从那个VC例子翻译过来的.
例子下载:
http://delphi.mychangshu.com/folder.asp?ID=28&amp;folder_Name=各类源码&amp;PageIndex=1
如果只是为了用Add-In的话,我建议还是用VB写,F1Book Add-In的demo中也有一个VB的demo,
至少你会觉得轻松不少.关于VB的代码编写注意事项,longbow74大侠有介绍:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=799781




 
这位仁兄
如果不嫌麻烦的话能否发个完整的f1book6的addin源程序给我好么(delphi的)
十分感谢
xxp1978@yeah.net
 
你可以做成Ocx而不是Dll呀!
提出你的要求,我可以帮你试试!
 
哎呀虽然不是十分满意(我更想得到一个详细的制作过程)
但总算得到一个,能用可以研究的例子
谢谢bluerain
 
后退
顶部