Delphi で使用する Visual Studio で COM オブジェクトを作成しました。
[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 ファイルを生成し、最後に、Delphi 5 にバンドルされている tlibimp.exe を使用して COM オブジェクトに対応するパスカル ファイルを生成しました。
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 オブジェクトのプロパティに書き込む命令を生成できないコンパイラの制限ですか?
これについて何か助けていただければ幸いです!