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

Project1

 找回密码
 注册会员
搜索
查看: 4676|回复: 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
头像被屏蔽

Lv2.观梦者 (禁止发言)

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

开拓者

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
85
在线时间
146 小时
注册时间
2011-8-14
帖子
70
3
 楼主| 发表于 2013-12-12 20:55:48 | 只看该作者
晴兰 发表于 2013-12-12 20:37
错误原因是:C#的类和DLL的导出函数。。根本就是两码事。。。就像一个火鸡一个熊猫
这里有四种方法使用这个 ...

谢谢。

第1点我试试看。


第2点COM方式调用不太明白

第3点,函数面前加static修饰,函数就不属于这个类了,应该可以调用。但不同明白您提到的 RuntimeHost途径是怎样,在RM中如何写


第4点的话,是以下这种调用吗?
#=======================#
sizz = Win32API.new('shell32.dll','ShellExecuteA',%w(p p p p p i),'i')
sizz.call(0, 'open', 'Lib/libForRM.exe',0, 0, 1)
#=======================#
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

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

开拓者

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
85
在线时间
146 小时
注册时间
2011-8-14
帖子
70
5
 楼主| 发表于 2013-12-12 21:09:55 | 只看该作者
晴兰 发表于 2013-12-12 21:01
第二点就是自己用CoCreateInstance来调用COM类厂构造对象,然后后面的就是COM系列API了
第三点是RuntimeH ...

我刚用VS2010建了个 VC++ /CLR类库
// vcTEST.h

#pragma once

using namespace System;

namespace vcTEST {


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

}

在RM中
执行
$test_API = Win32API.new("Lib/vcTEST","sumup",'ii','i')
t=0
p t.to_s
t=$test_API.call(3,2)
p t.to_s

还是出现上述类似问题
请问您,我问题出在哪
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

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

开拓者

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

使用道具 举报

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
回复 支持 反对

使用道具 举报

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调用工程)

回复 支持 反对

使用道具 举报

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
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

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

开拓者

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-30 07:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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