私はDelphiでWindows DLLを使用しています。機能がうまく割り当てられているかどうかを確認する必要があります。Delphi(パスカル)各フィールドが割り当てられているか確認してください
私はこのような属性はクラスで私のDLL関数を置くために、関数の型を宣言した:
@Self.m_MPOS_OpenResource := GetProcAddress(libHandler, '[email protected]');
@Self.m_MPOS_CloseResource := GetProcAddress(libHandler, '[email protected]');
@Self.m_MPOS_GetResourceID := GetProcAddress(libHandler, '[email protected]');
...
:
type
MPOS_OpenResource = function (ResID: DWORD; CplNum:BYTE; BlockingMode: DWORD):WORD;stdcall;
MPOS_CloseResource = function (ResID: DWORD; CplNum:BYTE):WORD;stdcall;
MPOS_GetResourceID = function (CplNum : Byte; ResID : PDWord) : word;stdcall;
...
その後、私はこのように私のdllクラスの各corespondingフィールドにメソッドを割り当てます
そして私は最終的にそれぞれ割り当てが巨大if
句で働いていたことを確認してください。
If(not Assigned(@m_MPOS_OpenResource) OR
not Assigned(@m_MPOS_CloseResource) OR
not Assigned(@m_MPOS_GetResourceID) OR
...) then { Some code for exception}
反射を使用して巨大なif
句を避けたいですが、動作するものが見つかりませんでした。私は複数のものを試して、最後のものはこれを始める:
for f in rttiType.GetFields() do
if(not Assigned(rttiType.GetField(f.Name).GetValue(Self))
OR (Self.FieldAddress(f.Name) = Nil)) then begin
ShowMessage('Field not assigned');
end;
end;
しかし、それは動作しません。誰かが私を助けることができますか?
代わりに、[ここ](http://stackoverflow.com/a/9263746/576719)で説明されているように、「遅延ロード」を使用することです。 –
ありがとう、これは私が必要と思われる:) – yanneke
'TRttiField.GetValue()'は 'TValue'を返します。 'Assigned()'をそれに使うことはできません。代わりに 'TValue.IsEmpty'を使用してください。また、 'TRttiField.FieldType.TypeKind'または' TValue.Kind'を使用して、ポインタフィールドで操作していることを確認できます。 –