为了允许从脚本语言(用C编写)访问Win32 API,我想编写如下函数:
void Call(LPCSTR DllName, LPCSTR FunctionName,
LPSTR ReturnValue, USHORT ArgumentCount, LPSTR Arguments[])它将一般地调用任何Win32 API函数。
( LPSTR参数实际上是作为字节数组使用的--假设它们的大小是正确的,以便在函数外部获得正确的数据类型。另外,我认为区分指针和非指针参数还需要一些额外的复杂性,但为了这个问题,我忽略了这一点)。
我遇到的问题是将参数传递到Win32 API函数中。因为这些都是stdcall,所以我不能使用varargs,所以“调用”的实现必须事先知道参数的数量,因此它不能是泛型的.
我认为我可以通过程序集代码(通过遍历参数,将每个参数推到堆栈)来实现这一点,但是这在纯C中是可能的吗?
更新:,我已经标记了“不,这是不可能的”答案,目前已被接受。如果一个基于C的解决方案被曝光,我当然会改变这一点。
更新: 红宝石/dl看起来可能是使用合适的机制实现的。关于这方面的任何细节将不胜感激。
发布于 2009-11-01 09:36:31
您可以尝试这样的方法--它适用于win32 API函数:
int CallFunction(int functionPtr, int* stack, int size)
{
if(!stack && size > 0)
return 0;
for(int i = 0; i < size; i++) {
int v = *stack;
__asm {
push v
}
stack++;
}
int r;
FARPROC fp = (FARPROC) functionPtr;
__asm {
call fp
mov dword ptr[r], eax
}
return r;
}“堆栈”参数中的参数应该是相反的顺序(因为这是它们被推到堆栈上的顺序)。
https://stackoverflow.com/questions/625784
复制相似问题