0

私は次の問題の前にいます:

私の主なプログラミング言語は Qt4 ライブラリを使用した C++ ですが、Pascal で C DLL の関数を使用できるようにする Pascal ラッパーを作成する必要があります。ここで、任意の Pointer からメソッドを呼び出せるようにしたいと考えています。しかし、メソッドを呼び出す Pascal メソッドが見つかりません。QT の QMetaObject::invokeMethod メソッドのようなものが欲しいです。次のコードを取得しました:

unit CgPConnect;

//{$mode objfpc}{$H+}
{$mode delphi}

interface

    uses
        Classes, SysUtils, dynlibs;

    type

        Callback = Record
          var callbackObject: Pointer;
          var objectFunction: string;
        end;

        CallbackObject = Record
          var objectName: string;
          var callback: Callback;
        end;

        MutableObject = Object
          var name: string;
          var state: string;
          var properties: array of VariantMap;
          var annotations: array of VariantMap;
        end;



        PConnect = Class
            constructor create(connectorPath: string);
            destructor destroy;

            private
                var hostactionCallbacks: array of CallbackObject;
                var mConnectorPath: string;
                var mConnectorLibrary: TLibHandle;
                function loadConnectorLibrary: Boolean;

            public
                procedure registerCallbackForHostaction(objectName, objectFunction: string; callbackObject: pointer);
                procedure callHostactionCallback(receivedObject :MutableObject);

                var mLibraryLoaded: Boolean;
        end;

    implementation

    constructor PConnect.create(connectorPath: string);
    begin
        mConnectorPath:= connectorPath;
        mLibraryLoaded:= false;
        //Eventuell noch slash hinzufügen
        mLibraryLoaded:= loadConnectorLibrary;
    end;

    destructor PConnect.destroy;
    begin
        UnloadLibrary(mConnectorLibrary);
    end;

    procedure PConnect.registerCallbackForHostaction(objectName, objectFunction: string; callbackObject: pointer);
    var c: Callback;
    var callbackCount: integer;
    begin
        if mLibraryLoaded = true then
        begin
            c.callbackObject:= callbackObject;
            c.objectFunction:= objectFunction;
            callbackCount:= Length(hostactionCallbacks)+1;
            SetLength(hostactionCallbacks, callbackCount);
            hostactionCallbacks[callbackCount].objectName:= objectName;
            hostactionCallbacks[callbackCount].callback:= c;
        end;
    end;

    procedure PConnect.callHostactionCallback(receivedObject :MutableObject);
    var receivedObjectName, objectFunction: string;
    var i, count: integer;
    var callbackObject: pointer;
    begin
        if mLibraryLoaded = true then
        begin
            receivedObjectName:= receivedObject.name;
            count:= Length(hostactionCallbacks);
            for i:=0 to count do
            begin
                if hostactionCallbacks[i].objectName = receivedObjectName
                begin
                    objectFunction:= hostactionCallbacks[i].callback.objectFunction;
                    callbackObject:= hostactionCallbacks[i].callback.callbackObject;
                    if callbackObject <> 0 then
                        //INVOKE METHOD (objectFunction) OF OBJECT (callbackObject)
                end;
            end;
        end;
    end;
end.

迅速な回答に満足しています:)

4

1 に答える 1

0

Pascal から C++ メソッドを直接かつ移植可能に呼び出すことはできません。コールバック関数が C++ オブジェクトの場合は、忘れてください。

それ以外の場合は、TMethod オブジェクトを埋めて、それを適切な「オブジェクトの手続き」宣言にキャストします。呼び出し規約を忘れないでください。

さらに奇妙な解決策については、(RemObjects の) Pascalscript を参照してください。

Ps これは、別の C++ コンパイラから確実に C++ メソッドを呼び出すことさえできないことと同じです。Pascal 対 C++ そのものではありません。

于 2013-02-06T16:02:56.323 に答える