设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4683|回复: 13
打印 上一主题 下一主题

[已经解决] 【RMXP DLL调用】DLL调用疑惑

[复制链接]

Lv1.梦旅人

梦石
0
星屑
85
在线时间
146 小时
注册时间
2011-8-14
帖子
70
跳转到指定楼层
1
发表于 2013-12-12 19:51:49 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 熊熊烈火雄壮 于 2013-12-17 17:40 编辑

尝试用rmxp调用dll方法来调用自己封装的窗体以及较复杂的功能函数

在C#里简单的编了下:
using System;
using System.Collections.Generic;
using System.Text;

namespace LibForRM
{
    public class Class1
    {
        public int add(int a, int b)
        {
            return a + b;
        }
    }
}
导出  LibForRM.dll

然后在rmxp中执行:
$test_API = Win32API.new("Lib/LibForRM","add",'ii','i')
t=0
p t.to_s
t=$test_API.call(3,2)
p t.to_s

弹出
发生RuntimeError错误
GetProcAdress: add or AddA

错误原因我想是因为C#中有类的概念,需要先找到这个类,再来引用这个类中的成员函数
但是不知道如何操作。

请问该如何正确在rmxp中调用。

@癫狂侠客 @后知后觉 @灵魂の补给 @zhangbanxian @高手们

点评

LZ应该是单机傲视的作者?  发表于 2013-12-14 13:24

Lv1.梦旅人

梦石
0
星屑
85
在线时间
146 小时
注册时间
2011-8-14
帖子
70
14
 楼主| 发表于 2013-12-17 17:11:01 | 只看该作者
晴兰 发表于 2013-12-17 14:58
类可以输出,但一般不能跨编译器调用,RM要直接用需要黑科技。不过,也可以为类写普通函数的的封装就不用 ...

非常感谢您的耐心解答,了然~
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

13
发表于 2013-12-17 14:58:55 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
85
在线时间
146 小时
注册时间
2011-8-14
帖子
70
12
 楼主| 发表于 2013-12-17 12:20:08 | 只看该作者
晴兰 发表于 2013-12-14 17:00
是这样的。。

首先,用这种方式导出的函数名会是_sumup@8,除非用#pragma或者def文件指示他生成sumup导 ...

还想再请问下您,类能否dll输出?rm中如何调用类中的函数?

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
85
在线时间
146 小时
注册时间
2011-8-14
帖子
70
11
 楼主| 发表于 2013-12-16 13:33:49 | 只看该作者
晴兰 发表于 2013-12-14 17:00
是这样的。。

首先,用这种方式导出的函数名会是_sumup@8,除非用#pragma或者def文件指示他生成sumup导 ...

谢谢!函数名导出后为 _sumup@8  这点太有用了!我改成这个后,调用成功了。
导出函数名都是这种形式么?  _原函数名@8

点评

_原函数名@参数大小,参数大小可以直接用参数个数*4代替,除了double和int64或long long算8字节。另外可以通过编译选项或者.def文件的方式让这个导出名就是sumup。   发表于 2013-12-16 14:37
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

10
发表于 2013-12-14 17:00:55 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
491
在线时间
339 小时
注册时间
2010-12-15
帖子
926

开拓者

9
发表于 2013-12-13 22:40:02 | 只看该作者
问题出在CLR上。
CLR的dll不是标准的dll。Win32API的dll必须是标准的Win32 DLL,而CLR的dll必须在电脑中安装.Net Framework才可以。
另外就是CLR的dll结构也和Win32API的dll结构不同。就算是用C++.Net写出来的dll,没有命名空间和类,它的结构和普通C++写出来的dll也还是不一样。

点评

结构不同没关系。。DLL在意的是调用接口  发表于 2013-12-14 15:25
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
85
在线时间
146 小时
注册时间
2011-8-14
帖子
70
8
 楼主| 发表于 2013-12-13 18:38:58 | 只看该作者
晴兰 发表于 2013-12-12 21:12
用extern "C" __declspec(dllexport) int __stdcall sumup(int a, int b);导出

static函数刚好是不导出 ...

在rm中调用,还是弹出
发生RuntimeError错误
GetProcAdress: sumup or sumupA错误

您能给一个例程吗?(dll工程+rm调用工程)

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
85
在线时间
146 小时
注册时间
2011-8-14
帖子
70
7
 楼主| 发表于 2013-12-12 21:25:54 | 只看该作者
晴兰 发表于 2013-12-12 21:12
用extern "C" __declspec(dllexport) int __stdcall sumup(int a, int b);导出

static函数刚好是不导出 ...

// vcTEST.h

#pragma once

using namespace System;

namespace vcTEST {

extern "C" __declspec(dllexport) int __stdcall sumup(int a, int b);//导出


   int __stdcall sumup(int a,int b)
   {
           return a+b;
   }

}
生成调用后,依然出现问题。。。

点评

另外使用CLR的库,要用#using指令.#using <System.dll>. 类似于普通的#include的作用  发表于 2013-12-13 08:57
什么问题?  发表于 2013-12-13 05:42
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

6
发表于 2013-12-12 21:12:36 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-30 11:37

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表