2

wxwdigets を使用してクラスを作成しました

//wrapper over wxIPV4address
class IPV4addressLua : public wxIPV4address
{

    public:
            IPV4addressLua();
            ~IPV4addressLua();
            bool    SetService (const wxString &service);
            bool    SetService (unsigned short service);
            unsigned short  GetService () const;
            wxSockAddress* GetwxSockAddress();
            wxIPV4address GetwxIPV4address();
            wxSocketServer* GetwxSocketServer();
};

SWIG 入力用の abc.i ファイルを次のように作成します。

%module wxAppManagerLua
%{
#include "wxAppManager.h"
#include "wx/socket.h"
%}

// wxIPV4address クラス IPV4addressLua のラッパー //: public wxIPV4address ................... ....

次に、SWIG バインディングを生成するための make ファイルを作成します: ===

TARGET= wxAppManagerLua.so
WRAPPER= wxAppManager_wrap.cxx
SRCS= $(ROOTSRC)/wxAppManager.cpp $(ROOTSRC)/XMLReader.cpp  $(WRAPPER)

INTERFACE=wxAppManager.i
CC=  g++
FLAGS=-shared  -fPIC -DDEBUG=1
SWIGFLGS= -lua -c++ -includeall -v
RM=rm -rfv

all:$(WRAPPER)

$(TARGET) : $(SRCS)
        $(CC) $(FLAGS) -o $(TARGET)  $(SRCS) $(EXTRAINC) $(WXCONFIGFLGS)

$(WRAPPER):
        swig $(SWIGFLGS) -I/usr/include  $(EXTRAINC) $(INTERFACE)

clean:
        $(RM)  *.so* $(WRAPPER)

...

===== 私はこのように私のものを生成します:-

g++ -g -shared -fPIC -o wxAppManagerLua.so ./wxAppManager_wrap.cxx ./wxAppManager/src/XMLReader.cpp ./wxAppManager/src/wxAppManager.cpp -I./ -I./wxAppManager/inc/ -I/usr/local/lib/wx/include/gtk2-ansi-debug-2.8 -I/usr/local/include/wx-2.8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D__WXDEBUG__ -D__WXGTK__ -pthread -L/usr/local/lib -pthread -lwx_gtk2d_richtext-2.8 -lwx_gtk2d_aui-2.8 -lwx_gtk2d_xrc-2.8 -lwx_gtk2d_qa-2.8 -lwx_gtk2d_html-2.8 -lwx_gtk2d_adv-2.8 -lwx_gtk2d_core-2.8 -lwx_based_xml-2.8 -lwx_based_net-2.8 -lwx_based-2.8

=====

lua ファイルを次のように記述します。

function CreateServer()

    -- Create the address - defaults to localhost:0 initially

    local addr = wxAppManagerLua.IPV4addressLua()
    if addr ~= nil then
            print(" Calling Bind Port ")
            addr:SetService(3000)
    end

    port = addr:GetService()
    print(" Binded to Port "..port)

    -- Create the socket
    SockAddr = wx.wxSockAddress

    --CODE FAILS HERE
    SOCKSERVER = wx.wxSocketServer(addr)

…………

...

私のコードは最後の行で失敗し、..

SockTestAppMgr.wx.lua:584: wxLua: パラメータ 1 に 'wxSockAddress' が必要ですが、'userdata' を取得しました。

呼び出された関数: 'wxSocketServer(userdata)'

01. wxSocketServer::wxSocketServer([wxSockAddress, integer])

スタック トレースバック:

        [C]: 関数 'wxSocketServer' 内
        SockTestAppMgr.wx.lua:584: 関数 'CreateServer' 内
        SockTestAppMgr.wx.lua:682: 関数 'main' 内
        SockTestAppMgr.wx.lua:694: メイン チャンク内

===== 注意してください ..... wxSockAddess は、クラスの派生元である wxIPV4address の基本クラスです。

このリンクをチェックしてくださいhttp://docs.wxwidgets.org/trunk/classwx_i_paddress.html

誰でも助けることができますか?

私の診断は:-

基本的な問題は、sos を作成するたびに... SWIG を使用して lua から関数またはクラスを参照しようとするときです.... wxwidget クラスまたは関数を参照するまで問題なく動作します...私の 2 つの sos でさえ参照できますsos のクラスに ... wxwidgets クラスではありません .... wx.so の任意のクラスを wx.so の他のクラスに引き続き参照すると、動作します ...

ルアが私のクラスのタイプを wxwidgets のクラスに理解するのを妨げている原因を教えてください。

wxwidgets のバインディングが SWIG ではなく従来の方法で生成されていることは知っています。これは問題の原因ですか?

4

1 に答える 1

3

SWIG が生成した型を、実行しようとしている関数呼び出しが理解できる型に変換する方法を SWIG に伝える必要があります。SWIG ユーザー ドキュメントのTypemap セクションを見てください。SWIG で生成された型を、SWIG 以外で生成された wxwidget バインディングによって認識される型に変換できる一連のタイプマップを考え出すことができるはずです。

于 2009-11-06T14:29:31.887 に答える