gpt4 book ai didi

c++ - Com interop : Why tlibimp. exe 生成只读属性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:31:02 25 4
gpt4 key购买 nike

我已经使用 Visual Studio 创建了一个 COM 对象,我想将其用于 Delphi。

[Guid("9D0CCD2D-75E9-46AC-BC40-C4D84669FC45")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyComClassDispatch
{
string PropertyString { get; set; }
string funcGetString();
void funcSetString(string aString);
}

[ClassInterface(ClassInterfaceType.None)]
public class MyComClassDispatch : IMyComClassDispatch
{
public string PropertyString { get; set; }


public string varString;

public string funcGetString()
{
return varString;
}

public void funcSetString(string aString)
{
varString = aString;
}
}

然后我生成了 tlb 文件,最后生成了一个与我的 COM 对象对应的 pascal 文件,其中包含与 Delphi 5 捆绑在一起的 tlibimp.exe:

C:\>tlibimp.exe -P+ mylib.tlb

这是生成的代码:

// *********************************************************************//
// DispIntf: IMyComClassDispatch
// Flags: (4096) Dispatchable
// GUID: {9D0CCD2D-75E9-46AC-BC40-C4D84669FC45}
// *********************************************************************//
IMyComClassDispatch = dispinterface
['{9D0CCD2D-75E9-46AC-BC40-C4D84669FC45}']
property PropertyString: WideString readonly dispid 1610743808;
function funcGetString: WideString; dispid 1610743810;
procedure funcSetString(const aString: WideString); dispid 1610743811;
end;

问题是我的属性被标记为只读,我真的不明白为什么会这样,因为这个工具也可以生成 C++ 代码并且可以修改属性:

// *********************************************************************//
// Interface : IMyComClassDispatch
// Indicateurs : (4096) Dispatchable
// GUID : {9D0CCD2D-75E9-46AC-BC40-C4D84669FC45}
// *********************************************************************//
interface IMyComClassDispatch : public TDispWrapper<IDispatch>
{
BSTR __fastcall get_PropertyString()
{
_TDispID _dispid(/* PropertyString */ DISPID(DISPID_UNKNOWN/*[1610743808]*/));
TAutoArgs<0> _args;
OlePropertyGet(_dispid, _args);
return _args.GetRetVariant();
}

void __fastcall set_PropertyString(BSTR Param1/*[in]*/)
{
_TDispID _dispid(/* PropertyString */ DISPID(1610743808));
TAutoArgs<1> _args;
_args[1] = Param1 /*[VT_BSTR:0]*/;
OlePropertyPut(_dispid, _args);
}

BSTR __fastcall funcGetString()
{
_TDispID _dispid(/* funcGetString */ DISPID(DISPID_UNKNOWN/*[1610743810]*/));
TAutoArgs<0> _args;
OleFunction(_dispid, _args);
return _args.GetRetVariant();
}

void __fastcall funcSetString(BSTR aString/*[in]*/)
{
_TDispID _dispid(/* funcSetString */ DISPID(DISPID_UNKNOWN/*[1610743811]*/));
TAutoArgs<1> _args;
_args[1] = aString /*[VT_BSTR:0]*/;
OleProcedure(_dispid, _args);
}


__property BSTR PropertyString = {read = get_PropertyString, write = set_PropertyString};
};

这是否意味着我应该避免使用 COM 对象的属性,或者是否有任何我应该更改的选项?这是 tlibimp 的问题还是编译器的限制无法生成写入 COM 对象属性的指令?

如有任何帮助,我们将不胜感激!

最佳答案

这是 Delphi 5 和 6 tlibimp.exe 中的已知缺陷。您应该升级到 Delphi 7 或更新版本以避免它。

关于c++ - Com interop : Why tlibimp. exe 生成只读属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12035102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com