我目前遇到了一个问题,同时玩弄Lua和外星人模块以使用Win32 API等来自Lua脚本。到目前为止,我只有一个关于使用API的外星人问题,使用某些结构,如CreateFontIndirect。Lua Alien - 调用特定的API
例如:
HFONT CreateFontIndirectA(const LOGFONT& lplf);
LOGFONT:
typedef struct tagLOGFONT {
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
}LOGFONT, *PLOGFONT;
问题在于字体外观名称。我无法让Lua在结构本身中保留一个字符串,它总是将一个指针放入结构中。所以我无法弄清楚,只能从Lua中使用这个API。
这是我得到的工作到一个点:
LOGFONT = alien.defstruct {
{ 'lfHeight', 'long' },
{ 'lfWidth', 'long' },
{ 'lfEscapement', 'long' },
{ 'lfOrientation', 'long' },
{ 'lfWeight', 'long' },
{ 'lfItalic', 'byte' },
{ 'lfUnderline', 'byte' },
{ 'lfStrikeOut', 'byte' },
{ 'lfCharSet', 'byte' },
{ 'lfOutPrecision', 'byte' },
{ 'lfClipPrecision', 'byte' },
{ 'lfQuality', 'byte' },
{ 'lfPitchAndFamily', 'byte' },
{ 'lfFaceName', 'string' } -- This line isn't working properly.
}
gdi32 = alien.load("gdi32.dll")
gdi32.CreateFontIndirectA:types {
ret = 'long',
abi = 'stdcall',
'pointer'
}
一个例子来调用它:
local lf = LOGFONT:new()
lf.lfHeight = 14
lf.lfWidth = 0
lf.lfEscapement = 0
lf.lfOrientation = 0
lf.lfWeight = 400
lf.lfItalic = 0
lf.lfUnderline = 0
lf.lfStrikeOut = 0
lf.lfCharSet = 0
lf.lfOutPrecision = 0
lf.lfClipPrecision = 0
lf.lfQuality = 0
lf.lfPitchAndFamily = 0
lf.lfFaceName = 'Terminal'
local hFont = gdi32.CreateFontIndirectA(lf())
调试我的应用程序,它运行我的脚本显示了API正确调用,除字体外,所有内容都正确传递。我试过各种不同的方法来使它工作,但我不能根据需要得到它。
有关修复这个问题的任何提示,而不用硬编码其他任何东西到exe中?
请在mascarenhas的回答下将其内容复制到评论后删除该答案,然后接受答案(点击左边的复选标记)。 – 2009-11-05 03:33:25