首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何编写调用Win32函数的通用C函数?

如何编写调用Win32函数的通用C函数?
EN

Stack Overflow用户
提问于 2009-03-09 10:50:35
回答 8查看 3.6K关注 0票数 6

为了允许从脚本语言(用C编写)访问Win32 API,我想编写如下函数:

代码语言:javascript
复制
void Call(LPCSTR DllName, LPCSTR FunctionName, 
  LPSTR ReturnValue, USHORT ArgumentCount, LPSTR Arguments[])

它将一般地调用任何Win32 API函数。

( LPSTR参数实际上是作为字节数组使用的--假设它们的大小是正确的,以便在函数外部获得正确的数据类型。另外,我认为区分指针和非指针参数还需要一些额外的复杂性,但为了这个问题,我忽略了这一点)。

我遇到的问题是将参数传递到Win32 API函数中。因为这些都是stdcall,所以我不能使用varargs,所以“调用”的实现必须事先知道参数的数量,因此它不能是泛型的.

我认为我可以通过程序集代码(通过遍历参数,将每个参数推到堆栈)来实现这一点,但是这在纯C中是可能的吗?

更新:,我已经标记了“不,这是不可能的”答案,目前已被接受。如果一个基于C的解决方案被曝光,我当然会改变这一点。

更新: 红宝石/dl看起来可能是使用合适的机制实现的。关于这方面的任何细节将不胜感激。

EN

Stack Overflow用户

发布于 2009-11-01 09:36:31

您可以尝试这样的方法--它适用于win32 API函数:

代码语言:javascript
复制
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;
}

“堆栈”参数中的参数应该是相反的顺序(因为这是它们被推到堆栈上的顺序)。

票数 1
EN
查看全部 8 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/625784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档