锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍓嶈呮瘮杈冨ソ璇達紝鍚庤呭湪鏍規嵁灞忓箷鍧愭爣璁$畻鏍煎瓙鍧愭爣鐨勬椂鍊欙紝紼嶅井鏈夌偣楹葷儲銆?/p>
鍏堣涓嬫垜浠殑鍧愭爣緋繪槸x杞村悜鍙籌紝y杞村悜涓婏紝鍘熺偣鍦ㄥ乏涓嬭銆?/p>
鏍煎瓙鍦板浘鍧愭爣濡備笅 鏍規嵁鏍煎瓙鍧愭爣璁$畻鍑哄搴斾笘鐣屽潗鏍囩郴鐨勫嚱鏁板涓?/p>
鎴浘濡備笅: 渚嬪瓙1

QPointF GridCell6Manager::getWorldPosByCellCoordinate(int x,int y)
{
if (x % 2 == 0)
return QPointF(1.5f*res*(x+1),
(0.5*R3+R3*y)*res);
return QPointF(1.5f*res*(x + 1),
(R3 + y * R3)*res);
}
QPoint GridCell6Manager::getCellCoordinateByWorldPos(int x,int y)
{
QPoint point(-1,-1);
float xpos = x-res*0.5f;
float ypos = y/(R3*res) - 0.5f;
int yset[2] = {std::floorf(ypos),std::ceilf(ypos)};
xpos /= (1.5*World::getInstance().getWorldResolution());
int xset[2] = { std::floorf(xpos),std::ceilf(xpos)};
auto p00 = getWorldPosByCellCoordinate(xset[0],yset[0]);
auto p01 = getWorldPosByCellCoordinate(xset[0],yset[1]);
auto p10 = getWorldPosByCellCoordinate(xset[1],yset[0]);
auto p11 = getWorldPosByCellCoordinate(xset[1],yset[1]);
float d00 = distance2<float>(x,y,p00.x(),p00.y());
float d01 = distance2<float>(x,y,p01.x(),p01.y());
float d10 = distance2<float>(x,y,p10.x(),p10.y());
float d11 = distance2<float>(x,y,p11.x(),p11.y());
int i,j;
if(d00 < d01 && d00 < d10 && d00 < d11)
{
i = xset[0];
j = yset[0];
}
else if(d00 > d01 && d01 < d10 && d01 < d11)
{
i = xset[0];
j = yset[1];
}
else if(d10 < d00 && d10 < d01 && d10 < d11)
{
i = xset[1];
j = yset[0];
}
else
{
i = xset[1];
j = yset[1];
}
return QPoint(i,j);
}
鍦ㄨ繖涓熀紜涓婂氨鍙互璁$畻浠庝笘鐣屽潗鏍囧埌鏍煎瓙鍧愭爣鐨勮漿鎹簡
]]>
#include <wininet.h>
#include <stdio.h>
#include <string>
#include <io.h>
using namespace std;
#pragma comment(lib, "wininet.lib")
const DWORD DWORD_MAX_CCH_OF_TEST_URL = 256;
const DWORD DWORD_MAX_CCH_OF_HOST_NAME = 128;
const DWORD DWORD_MAX_CCH_OF_URL_PATH = 256;
int breakpointDownload(const std::wstring& url, const std::wstring& folder, void(*cb)(double),std::wstring& name)
{
int index = url.find_last_of(L'/');
std::wstring filename = url.substr(index + 1);
index = filename.find_first_of(L'?');
if (index != std::wstring::npos)
filename = filename.substr(0,index);
if (!folder.empty())
filename = folder + L"\\" + filename;
std::wstring tempfile = filename + L".dl";
_wremove(filename.c_str());
HINTERNET hInetOpen = NULL;
HINTERNET hInetConnect = NULL;
HINTERNET hInetRequest = NULL;
HANDLE lhFile = NULL;
URL_COMPONENTS ldCrackedURL;
ZeroMemory(&ldCrackedURL, sizeof(URL_COMPONENTS));
ldCrackedURL.dwStructSize = sizeof(URL_COMPONENTS);
TCHAR szHostName[DWORD_MAX_CCH_OF_HOST_NAME] = { 0 };
ldCrackedURL.lpszHostName = szHostName;
ldCrackedURL.dwHostNameLength = DWORD_MAX_CCH_OF_HOST_NAME;
wchar_t szUrlPath[DWORD_MAX_CCH_OF_URL_PATH] = { 0 };
ldCrackedURL.lpszUrlPath = szUrlPath;
ldCrackedURL.dwUrlPathLength = DWORD_MAX_CCH_OF_URL_PATH;
if (FALSE == InternetCrackUrl(url.c_str(),url.size(), 0, &ldCrackedURL))
{
return 0;
}
hInetOpen = InternetOpen(L"MSIE/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (NULL == hInetOpen)
{
return 0;
}
hInetConnect = InternetConnect(hInetOpen, ldCrackedURL.lpszHostName, ldCrackedURL.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if (NULL == hInetConnect)
{
return 0;
}
lhFile = CreateFile(tempfile.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (lhFile == INVALID_HANDLE_VALUE)
{
return 0;
}
LARGE_INTEGER ldFileSize;
if (FALSE == GetFileSizeEx(lhFile, &ldFileSize))
{
return 0;
}
LONGLONG lllStartPos = 0;
if(0 == ldFileSize.QuadPart)
{
}
else
{
if (INVALID_SET_FILE_POINTER == SetFilePointer(lhFile, 0, NULL, FILE_END))
{
return 0;
}
lllStartPos = ldFileSize.QuadPart;
}
wchar_t lscRangeStartPosition[30] = { 0 };
if (0 != _i64tow_s((__int64)(lllStartPos), lscRangeStartPosition, sizeof(lscRangeStartPosition), 10))
{
return 0;
}
wstring loAdditionalHeader = L"Range: bytes=";
loAdditionalHeader += lscRangeStartPosition;
loAdditionalHeader += L"-\r\n";
const wchar_t* lplpszAcceptTypes[] = { L"*/*", NULL };
hInetRequest = HttpOpenRequest(hInetConnect,L"GET", ldCrackedURL.lpszUrlPath,L"HTTP/1.1", NULL,lplpszAcceptTypes, 0, 0);
if (NULL == hInetConnect)
{
return 0;
}
if (FALSE == HttpSendRequest(hInetRequest, loAdditionalHeader.c_str(), loAdditionalHeader.size(), NULL, 0))
{
return 0;
}
DWORD ldwStatusCode;
DWORD ldwCbOfStatusCode = sizeof(ldwStatusCode);
if (FALSE == HttpQueryInfo(hInetRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &ldwStatusCode, &ldwCbOfStatusCode, 0))
{
return 0;
}
if (416 == ldwStatusCode)
{
_wrename(tempfile.c_str(), filename.c_str());
name = filename;
return 1;
}
else if (200 != ldwStatusCode && 206 != ldwStatusCode)
{
return 0;
}
DWORD dwFile = 10000;
DWORD dwSize = sizeof(DWORD);
if (FALSE == HttpQueryInfo(hInetRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwFile, &dwSize, 0))
{
}
else
dwFile += lllStartPos;
BYTE lpbBufferToReceiveData[2048];
DWORD ldwCbBuffer = 2048;
DWORD ldwCrtCbReaded;
DWORD ldwCbWritten = 0;
bool lbIsOk = false;
LONGLONG lllCbAllRead = lllStartPos;
do
{
if (FALSE == InternetReadFile(hInetRequest, lpbBufferToReceiveData, ldwCbBuffer, &ldwCrtCbReaded))
{
break;
}
if (ldwCrtCbReaded == 0)
{
break;
}
if (FALSE == WriteFile(lhFile, lpbBufferToReceiveData, ldwCrtCbReaded, &ldwCbWritten, NULL) || ldwCbWritten != ldwCrtCbReaded)
{
break;
}
ZeroMemory(lpbBufferToReceiveData, ldwCrtCbReaded);
lllCbAllRead += ldwCrtCbReaded;
double p = lllCbAllRead * 100.0 / dwFile;
if (p > 100)
p = 100;
if (cb)
cb(p);
} while (true);
if (NULL != lhFile)
{
CloseHandle(lhFile);
}
if (NULL != hInetRequest)
{
InternetCloseHandle(hInetRequest);
}
if (NULL != hInetConnect)
{
InternetCloseHandle(hInetConnect);
}
if (NULL != hInetOpen)
{
InternetCloseHandle(hInetOpen);
}
_wrename(tempfile.c_str(), filename.c_str());
name = filename;
return 1;
}
]]>
from SharePm,QQ,ShareAm
where ShareAm.date = QQ.date and
SharePm.code = QQ.code and
ShareAm.code = SharePm.code and
date(ShareAm.date,'+1 day') = SharePm.date
order by SharePm.date asc
]]>

using namespace bge;
class Dispatcher : public SlotHolder
{
public:
Dispatcher(ImageBox* image,Button* button)
{
image_ = image;
button_ = button;
count_ = 1;
}
void click()
{
std::string file = ":box/side";
file += toString(count_);
file += ".png";
image_->setImage(file);
count_ ++;
if(count_ == 7)
count_ = 1;
}
private:
ImageBox* image_;
Button* button_;
int count_;
};
int main(int argc,char* argv[])
{
FileSystem::instance().initial(argv[0]);
FileSystem::instance().setResourcePackage("data.zip");
WindowManager::instance().initialize(":accid.ttf",false);
Device* device = Device::create();
device->initial();
device->createWindow(640,480,String("BGE Window"));
Panel* panel = new Panel();
panel->setPosition(Vector2f(20,20));
panel->setSize(Vector2f(128,128+24));
ImageBox* image = new ImageBox();
image->setImage(":box/side6.png");
image->setPosition(Vector2f(0,0));
image->setSize(Vector2f(128,128));
Button* button = new Button();
button->loadAppearance(":buttonskin1.xml");
button->setSize(Vector2f(128,24));
button->setText(L"Click");
Dispatcher dispacher(image,button);
button->clicked.connect(&dispacher,&Dispatcher::click);
BoxLayout* layout = new BoxLayout();
layout->setSpacing(.0f);
panel->setLayout(layout);
layout->setJustification(Orientation_vertical);
layout->addWindow(image);
layout->addWindow(button);
panel->adjust();
WindowManager::instance().addWindow(panel);
while(device->isRunning())
{
device->preRender();
WindowManager::instance().update();
device->swapBuffers();
device->pollEvents();
}
WindowManager::instance().terminate();
device->closeWindow();
device->terminate();
device->deleteLater();
return 0;
}
渚嬪瓙2
using namespace bge;
class Dispatcher : public SlotHolder
{
public:
Dispatcher(StackLayout* layout,Button* button)
{
layout_ = layout;
button_ = button;
count_ = 0;
}
void click()
{
layout_->setCurrentIndex(count_);
count_ ++;
if(count_ > 5)
count_ = 0;
}
private:
StackLayout* layout_;
Button* button_;
int count_;
};
int main(int argc,char* argv[])
{
FileSystem::instance().initial(argv[0]);
FileSystem::instance().setResourcePackage("data.zip");
WindowManager::instance().initialize(":accid.ttf",false);
Device* device = Device::create();
device->initial();
device->createWindow(640,480,String("BGE Window"));
Panel* panel = new Panel();
panel->setPosition(Vector2f(20,20));
panel->setSize(Vector2f(128,128+24));
Panel* stackPanel = new Panel();
stackPanel->setSize(Vector2f(128,128));
StackLayout* stackLayout = new StackLayout();
stackPanel->setLayout(stackLayout);
stackLayout->setSpacing(.0f);
for(int i=1;i<7;i++)
{
ImageBox* image = new ImageBox();
std::string file = ":box/side";
file += toString(i);
file += ".png";
image->setImage(file);
image->setPosition(Vector2f(0,0));
image->setSize(Vector2f(128,128));
stackLayout->insertWindow(i,image);
}
Button* button = new Button();
button->loadAppearance(":buttonskin1.xml");
button->setSize(Vector2f(128,24));
button->setText(L"Click");
Dispatcher dispacher(stackLayout,button);
button->clicked.connect(&dispacher,&Dispatcher::click);
BoxLayout* layout = new BoxLayout();
layout->setSpacing(.0f);
panel->setLayout(layout);
layout->setJustification(Orientation_vertical);
layout->addWindow(stackPanel);
layout->addWindow(button);
panel->adjust();
WindowManager::instance().addWindow(panel);
while(device->isRunning())
{
device->preRender();
WindowManager::instance().update();
device->swapBuffers();
device->pollEvents();
}
WindowManager::instance().terminate();
device->closeWindow();
device->terminate();
device->deleteLater();
return 0;
}
榪?涓樉紺烘晥鏋滃畬鍏ㄤ竴鏍?br />嬈㈣繋涓嬭澆



鍦ㄨ繖閲屼笅杞?
浠g爜鏈夌偣澶?榪欓噷鏀句笉涓?br />
]]>
using namespace bge;
int main(int argc,char* argv[])
{
//!鍒濆鍖栨枃浠剁郴緇?/span>
FileSystem::instance()->initial(argv[0]);
//!鍔犺澆鍘嬬緝鍖?/span>
FileSystem::instance()->setResourcePackage("data.zip");
//!鍒濆鍖朥I綆$悊鍣?璁懼畾榛樿瀛椾綋,騫惰瀹氳嚜鍔ㄥ垹闄ゆ帶浠?/span>
WindowManager::instance().initialize("simkai.ttf",true);
//!鐢熸垚鍜屽垵濮嬪寲紿楀彛璁懼
Device* device = bgeCreateDevice();
device->initial();
device->createWindow(640,480,bge::String("BGE Window"));
//!浠庤祫婧愭枃浠跺姞杞芥帶浠跺寘鍚瓙鎺т歡鍜屾帶浠跺睘鎬?/span>
Window* window = WindowManager::instance().create("window.xml");
bge::WindowManager::instance().addWindow(listbox);
while(device->isRunning())
{
//!棰勬覆鏌撹澶?/span>
device->perRender();
//!紿椾綋鏇存柊
bge::WindowManager::instance().update();
device->swapBuffers();
device->pollEvents();
}
//!閿姣佺獥浣撶鐞嗗櫒
bge::WindowManager::instance().terminate();
//!鍏抽棴騫墮攢姣佽澶?/span>
device->closeWindow();
device->terminate();
device->deleteLater();
system("pause");
return 0;
}
榪樻病鍋氬畬錛岀敤娉曞涓婏紝寰堢畝緇冨惂:D
浠涔堬紵瀵規暣浣撹鏁堜笉婊℃剰錛?br />璇曚笅榪欎釜:
鎯沖畾鍒舵煇涓帶浠剁殑瑙嗘晥?
Button* button = window->findChild("ok");
button->loadAppearance("button.xml","blue");
]]>
浠g爜寰堣緇嗭紝涓嶉渶棰濆瑙i噴
ReferenceCountedImage(filename),
data_(0)
{
IOReader* reader = FileSystem::instance()->readFile(filename);
if(reader == 0)
return;
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
if(png_ptr == 0)
{
reader->close();
reader->deleteLater();
}
png_infop info_ptr = png_create_info_struct(png_ptr);
if(info_ptr == 0)
{
png_destroy_read_struct(&png_ptr, png_infopp(0), png_infopp(0));
reader->close();
reader->deleteLater();
}
if(setjmp(png_jmpbuf(png_ptr)))
{
png_destroy_read_struct(&png_ptr,png_infopp(0),png_infopp(0));
reader->close();
reader->deleteLater();
}
png_set_read_fn( png_ptr,reader,(png_rw_ptr)user_read_data);
png_set_sig_bytes(png_ptr,0);
png_read_png(png_ptr,info_ptr,PNG_TRANSFORM_IDENTITY,0);
const unsigned int width = png_get_image_width(png_ptr,info_ptr);
const unsigned int height = png_get_image_height(png_ptr,info_ptr);
const unsigned int bit_depth = png_get_bit_depth(png_ptr,info_ptr);
if(bit_depth != 8)
{
reader->close();
reader->deleteLater();
png_destroy_info_struct(png_ptr,png_infopp(&info_ptr));
png_destroy_read_struct(&png_ptr,png_infopp(0), png_infopp(0));
}
const png_byte colorType = png_get_color_type(png_ptr, info_ptr);
if((colorType != PNG_COLOR_TYPE_RGB) && (colorType != PNG_COLOR_TYPE_RGB_ALPHA))
{
reader->close();
reader->deleteLater();
png_destroy_info_struct(png_ptr, png_infopp(&info_ptr));
png_destroy_read_struct(&png_ptr, png_infopp(0), png_infopp(0));
}
const int bytesPerPixel = (colorType == PNG_COLOR_TYPE_RGB) ? 3 : 4;
const int stride = bytesPerPixel * width;
unsigned char* data = new unsigned char[stride * height];
png_bytep* row_pointers = png_get_rows(png_ptr, info_ptr);
for(unsigned int i = 0; i < height; ++i)
{
const unsigned int row = height - i - 1;
memcpy(data + (row * stride), row_pointers[i], stride);
}
size_.x_ = width;
size_.y_ = height;
numberOfBitsPerPixel_ = bytesPerPixel * 8;
data_ = data;
reader->close();
reader->deleteLater();
png_destroy_info_struct(png_ptr, png_infopp(&info_ptr));
png_destroy_read_struct(&png_ptr, png_infopp(0), png_infopp(0));
}
]]>
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#ifdef WIN32
#include <io.h>
#else
#include <unistd.h>
#endif
#define REMOTE_URL "sftp://account:password@xx.xx.xx.xx/"
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
curl_off_t nread;
size_t retcode = fread(ptr, size, nmemb, stream);
nread = (curl_off_t)retcode;
fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T " bytes from file\n", nread);
return retcode;
}
int main(int argc,char *argv[])
{
if(argc != 3)
{
printf("2 paramenters is needed.\n");
return -1;
}
char* local_file = argv[1];
char* remote_file = argv[2];
printf("call me for update -:%s,%s\n",local_file,remote_file);
char remoteurl[1024] = {0};
strcpy(remoteurl,REMOTE_URL);
strcat(remoteurl,remote_file);
CURL* curl;
CURLcode res;
FILE* file;
struct stat file_info;
curl_off_t fsize;
if(stat(local_file,&file_info))
{
printf("couldnt open '%s': %s\n", local_file, strerror(errno));
return 1;
}
fsize = (curl_off_t)file_info.st_size;
printf("Local file size: %" CURL_FORMAT_CURL_OFF_T " bytes.\n", fsize);
file = fopen(local_file, "rb");
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl,CURLOPT_READFUNCTION,read_callback);
curl_easy_setopt(curl,CURLOPT_UPLOAD,1L);
curl_easy_setopt(curl,CURLOPT_URL,remoteurl);
curl_easy_setopt(curl,CURLOPT_READDATA,file);
curl_easy_setopt(curl,CURLOPT_INFILESIZE_LARGE,(curl_off_t)fsize);
curl_easy_setopt(curl,CURLOPT_FTP_RESPONSE_TIMEOUT,120);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr,"curl_easy_perform() failed: %s\n",curl_easy_strerror(res));
curl_easy_cleanup(curl);
fprintf(stderr,"finished update.");
}
fclose(file);
curl_global_cleanup();
return 0;
}
浠ヤ笂浠g爜緇忚繃瀹為檯嫻嬭瘯.
]]>
void alThunkExit(void);
ALuint alThunkAddEntry(ALvoid * ptr);
void alThunkRemoveEntry(ALuint index);
ALvoid *alThunkLookupEntry(ALuint index);
typedef struct {
ALvoid *ptr;
ALboolean InUse;
} ThunkEntry;
static ThunkEntry *g_ThunkArray;
static ALuint g_ThunkArraySize;
static CRITICAL_SECTION g_ThunkLock;
void alThunkInit(void)
{
InitializeCriticalSection(&g_ThunkLock);
g_ThunkArraySize = 1;
g_ThunkArray = calloc(1, g_ThunkArraySize * sizeof(ThunkEntry));
}
void alThunkExit(void)
{
free(g_ThunkArray);
g_ThunkArray = NULL;
g_ThunkArraySize = 0;
DeleteCriticalSection(&g_ThunkLock);
}
ALuint alThunkAddEntry(ALvoid *ptr)
{
ALuint index;
EnterCriticalSection(&g_ThunkLock);
for(index = 0;index < g_ThunkArraySize;index++)
{
if(g_ThunkArray[index].InUse == AL_FALSE)
break;
}
if(index == g_ThunkArraySize)
{
ThunkEntry *NewList;
NewList = realloc(g_ThunkArray, g_ThunkArraySize*2 * sizeof(ThunkEntry));
if(!NewList)
{
LeaveCriticalSection(&g_ThunkLock);
return 0;
}
memset(&NewList[g_ThunkArraySize], 0, g_ThunkArraySize*sizeof(ThunkEntry));
g_ThunkArraySize *= 2;
g_ThunkArray = NewList;
}
g_ThunkArray[index].ptr = ptr;
g_ThunkArray[index].InUse = AL_TRUE;
LeaveCriticalSection(&g_ThunkLock);
return index+1;
}
void alThunkRemoveEntry(ALuint index)
{
EnterCriticalSection(&g_ThunkLock);
if(index > 0 && index <= g_ThunkArraySize)
g_ThunkArray[index-1].InUse = AL_FALSE;
LeaveCriticalSection(&g_ThunkLock);
}
ALvoid *alThunkLookupEntry(ALuint index)
{
ALvoid *ptr = NULL;
EnterCriticalSection(&g_ThunkLock);
if(index > 0 && index <= g_ThunkArraySize)
ptr = g_ThunkArray[index-1].ptr;
LeaveCriticalSection(&g_ThunkLock);
return ptr;
}
]]>
涔嬪悗鍙戠幇鎺т歡澶勪簬GONE鐘舵侊紝浣嗘槸鎺т歡榪樻槸鍙鐨?br />涓婄綉鏌ヤ簡涓嬪彂鐜拌娓呯┖鍔ㄧ敾錛屼篃灝辨槸imageView.clearAnimation
鍏跺疄鎴戣寰楀鏋滆皟鐢╯etVisibility(View.GONE)涔嬪悗鏃犺褰撳墠鏈夋棤鍔ㄧ敾閮藉簲璇ユ秷澶?br />璁劇疆涓篏ONE鐘舵佸悗鎺т歡鐘舵佸嚭鐜板紓甯?br />
鎸夌収褰撳墠鎯呭喌瑕侀殣钘忔帶浠墮渶瑕佸厛璋冪敤cleanAnimation,涔嬪悗call setVisibility
鎵浠ユ湁絀烘兂鎯砤ndroid API涔熷茍闈炲崄鍏ㄥ崄緹?
鍚勪綅瑙夊緱鍛紵
]]>
]]>
#define STREAM_BUFFER_H
#include <stdio.h>
#include <stdlib.h>
#include "gaudio.h"
typedef struct _streamBuffer streamBuffer;
//typedef size_t(*streamRead)(void* ctx,void* ptr,size_t size,size_t nmemb);
//typedef int(*streamSeek)(void* ctx,glong offset,int flag);
//typedef int(*streamClose)(void* ctx);
streamBuffer* stream_open_file(const gchar* file);
streamBuffer* stream_open_mem(gvoid* mem,gulong size);
streamBuffer* stream_open_callbacks(gread read,gseek seek,gtell tell,gclose close,gvoid* context);
glong stream_read(streamBuffer* stream,gvoid* ptr,gint size,glong nmemb);
glong stream_seek(streamBuffer* stream,glong offset,gint flag);
glong stream_close(streamBuffer* stream);
#endif
//! by ccsdu2004
#include <string.h>
#include "streamBuffer.h"
#include "gmemory.h"
struct _streamBuffer
{
gread read;
gseek seek;
gclose close;
gtell tell;
void* ctx;
};
typedef struct _stdIOContext
{
FILE *fp;
}stdIOContext;
glong stdio_stream_read(gvoid* ptr,gint size,glong nmemb,gvoid* ctx)
{
return fread(ptr,size,nmemb,((stdIOContext*)ctx)->fp);
}
glong stdio_stream_seek(gvoid* ctx,glong offset,gint flag)
{
return fseek(((stdIOContext*)ctx)->fp,offset,flag);
}
glong APIENTRY stdio_stream_tell(gvoid* ctx)
{
return ftell(((stdIOContext*)ctx)->fp);
}
glong stdio_stream_close(gvoid* ptr)
{
stdIOContext* ctx = (stdIOContext*)ptr;
gint ret = 0;
ret = fclose(ctx->fp);
gFreeBuffer(ctx);
return ret;
}
typedef struct memContext
{
guchar* base;
guchar* current;
guchar* end;
}memContext;
glong mem_stream_read(gvoid* ptr,gint size,glong nmemb,gvoid* ctx)
{
streamBuffer* stream = (streamBuffer*)ctx;
memContext *c;
glong count;
c = (memContext*)stream;
count = nmemb;
if(c->current + count * size > c->end)
count = (c->end - c->current) / size;
memcpy(ptr, c->current, count * size);
c->current += count * size;
return count;
}
glong mem_stream_seek(gvoid* ctx,glong offset,gint flag)
{
streamBuffer* stream = (streamBuffer*)ctx;
memContext* c;
c = (memContext*)stream;
if(c == NULL)
return -1;
if(flag == SEEK_SET)
{
if(offset < 0 || offset > c->end - c->base)
return -1;
c->current = c->base + offset;
return 0;
}
else if(flag == SEEK_CUR)
{
if(offset > 0)
{
if(offset > c->end - c->current)
return -1;
c->current += offset;
return 0;
}
else if(offset < 0)
{
if(-offset > c->current - c->base)
return -1;
c->current += offset;
return 0;
}
}
else if(flag == SEEK_END)
{
if(offset > 0 || offset > c->end - c->base)
return -1;
c->current = c->end - offset;
return 0;
}
return -1;
}
glong mem_stream_close(gvoid *ptr)
{
memContext* ctx = (memContext*)ptr;
gFreeBuffer(ctx->base);
gFreeBuffer(ctx);
return 0;
}
streamBuffer* stream_open_fp(FILE* fp)
{
stdIOContext* ctx;
streamBuffer* stream;
stream = gcreate_buffer<streamBuffer>(1);
if(stream == NULL)
return NULL;
ctx = gcreate_buffer<stdIOContext>(1);
if(ctx == NULL)
{
gFreeBuffer(stream);
return NULL;
}
ctx->fp = fp;
stream->ctx = ctx;
stream->read = stdio_stream_read;
stream->seek = stdio_stream_seek;
stream->close = stdio_stream_close;
return stream;
}
streamBuffer* stream_open_file(const gchar *file)
{
FILE *fp;
fp = fopen((char*)file,"rb");
if(fp == NULL)
return NULL;
return stream_open_fp(fp);
}
streamBuffer* stream_open_mem(gvoid* mem,gulong size)
{
memContext* ctx;
streamBuffer* stream;
stream = gcreate_buffer<streamBuffer>(1);
if(stream == NULL)
return NULL;
ctx = gcreate_buffer<memContext>(1);
if(ctx == NULL)
{
gFreeBuffer(stream);
return NULL;
}
ctx->base = (guchar*)mem;
ctx->current = (guchar*)mem;
ctx->end = ((guchar*) mem) + size;
stream->ctx = ctx;
stream->read = mem_stream_read;
stream->seek = mem_stream_seek;
stream->close = mem_stream_close;
return stream;
}
streamBuffer* stream_open_callbacks(gread read,gseek seek,gtell tell,gclose close,gvoid* context)
{
streamBuffer* stream = gcreate_buffer<streamBuffer>(1);
if(stream == NULL)
return NULL;
stream->ctx = context;
stream->read = read;
stream->seek = seek;
stream->tell = tell;
stream->close = close;
return stream;
}
glong stream_read(streamBuffer* stream,gvoid* ptr,gint size,glong nmemb)
{
return stream->read(ptr,size,nmemb,stream->ctx);
}
glong stream_seek(streamBuffer* stream,glong offset,gint flag)
{
return stream->seek(stream,offset,flag);
/*size_t c;
char tmp[1024];
while(offset > 0)
{
c = offset;
if(c > 1024)
c = 1024;
offset -= c;
if(c != stream_read(stream,tmp,1,c))
{
}
}
return 1;*/
}
glong stream_close(streamBuffer* stream)
{
gint ret = stream->close(stream->ctx);
gFreeBuffer(stream);
return ret;
}
]]>
call.py
print 'hello world'
def add(a,b):
return a + b
api.py
def load_test():
fp = open('call.py','r')
buffer = ''
if fp:
buffer = fp.read()
fp.close()
return buffer
cpp浠g爜:
#include <stdlib.h>
#include <Python.h>
int main(int argc, char *argv[])
{
Py_Initialize();
if(!Py_IsInitialized())
{
return -1;
}
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
PyObject* pName;
PyObject* pModule;
PyObject* pDict;
PyObject* pFunc;
pName = PyString_FromString("api");
pModule = PyImport_Import(pName);
if(!pModule)
{
printf("can't find call.py");
getchar();
return -1;
}
pDict = PyModule_GetDict(pModule);
if(!pDict)
{
return -1;
}
{
pFunc = PyDict_GetItemString(pDict,"load_test");
if(!pFunc || !PyCallable_Check(pFunc))
{
printf("can't find function [test]");
getchar();
return -1;
}
PyObject *pFn = PyObject_CallObject(pFunc,0);
char* buffer = PyString_AsString(pFn);
printf("%s\n",buffer);
PyObject* o = Py_CompileString(buffer,"none",Py_file_input);
PyObject* m = PyImport_ExecCodeModule("a.a",o);
PyObject* d = PyModule_GetDict(m);
pFunc = PyDict_GetItemString(d,"add");
if(!pFunc || !PyCallable_Check(pFunc))
{
printf("can't find function [add]");
getchar();
return -1;
}
PyObject* args = PyTuple_New(2);
PyTuple_SetItem(args,0,Py_BuildValue("l",3));
PyTuple_SetItem(args,1,Py_BuildValue("l",4));
PyObject *pAdded = PyObject_CallObject(pFunc,args);
int ret = PyInt_AsLong(pAdded);
printf("add value:%d\n",ret);
}
Py_Finalize();
system("PAUSE");
return 0;
}
榪欐浠g爜鍜屼笂涓綃囨湁鐐瑰尯鍒?br />涓昏鍖哄埆鏄粠浠庡唴瀛樿澆鍏ython妯″潡鐒跺悗璋冪敤鍑芥暟
涓昏閮ㄥ垎鏄繖鍧?
PyObject* m = PyImport_ExecCodeModule("a.a",o);
PyObject* d = PyModule_GetDict(m);
鍦╬ython2.7涓墽琛屾甯?br />
]]>