精华内容
下载资源
问答
  • Pb调用 c#编写DLL

    2014-08-24 21:29:45
    Pb调用 c#编写DLL的方法 C#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了它...
  • 在c# 中编写com组件,供PB调用实例前言:c#中写的dll直接是不能被pb调用的,只有写成com组件才可以调用,所以用c#写dll时要注意。c#中新建类库类库类型为通用类库,项目名为AddCom1、配置:右键点击解决方案资源管理...

    在c# 中编写com组件,供PB调用实例

    前言:c#中写的dll直接是不能被pb调用的,只有写成com组件才可以调用,所以用c#写dll时要注意。

    c#中新建类库

    类库类型为通用类库,项目名为AddCom

    1、配置:右键点击解决方案资源管理器中的AddCom,选择“属性”,选择“应用程序”->“程序集信息”,勾选“使程序集COM可见”,然后点击“生成”,选择“为COM互操作注册”

    2、打开AssemblyInfo.cs文件,设置[assembly: ComVisible(true)],如果不改则不能被其他程序调用

    3、编写com组件会用到guid(全球唯一ID),编写com组件必须要用到。c#会默认生成一个放在AssemblyInfo.cs,如没有生成,可以用GUID生成器生成,也可以网上下一个生成guid的软件

    4、c#中源代码如下

    usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;namespaceAddCom

    {

    [Guid("298D881C-E2A3-4638-B872-73EADE25511C")]public interfaceAddComInterface

    {

    [DispId(1)]int iadd(int a, intb);

    }

    [Guid("2C5B7580-4038-4d90-BABD-8B83FCE5A467")]

    [ClassInterface(ClassInterfaceType.None)]public classAddComService : AddComInterface

    {publicAddComService()

    {

    }public int iadd(int a, intb)

    {int c = 0;

    c= a +b;returnc;

    }

    }

    }

    至此,关于C#的Dll已经操作完成,下面开始注册

    注册DLL

    注册有两种方法

    1、C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe E:\Test\MyLib.dll /tlb: E:\Test\MyLib.tlb

    反注册:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /u E:\Test\MyLib.dll /tlb: E:\Test\MyLib.tlb

    (   这个地址是安装Framework的物理地址,根据自己电脑不同进行修改)得到下面图所示即成功注册

    2、run("regasm MyLib.dll /tlb: MyLib.tlb",minimized!)

    前提是把regasm.exe文件复制到当前项目中

    PB调用DLL

    pb中利用ole调用来调用com组件

    OLEObject OLEObjectlongli_statusintli_regintli_celstring a = "aa"

    string b = "bb"

    //创建OLEObject对象

    OLEObject =Create OLEObject//创建连接

    li_status= OLEObject.ConnectToNewObject("RakbLibrary.Class1")if li_status<>0then//连接不成功,先反注册组件,再重新注册组件

    li_cel = run("regasm /u RakbLibrary.dll /tlb:RakbLibrary.tlb",minimized!)if li_cel <> 1then

    messagebox('提示','反注册失败!')return

    elsemessagebox('提示','反注册成功!')

    li_reg= run("regasm RakbLibrary.dll /tlb:RakbLibrary.tlb",minimized!)if li_reg<>1then

    messagebox('提示','组件注册失败!')return

    elsemessagebox('提示','组件注册成功!')

    endifendif

    else

    //调用类内的公共函数

    li_res =OLEObject.getForm(a,b)

    endif

    //释放资源

    OLEObject.DisConnectObject()

    如果返回值是-3 ,Object could not be created   生成exe执行文件就好了

    注意:li_status 连接状态是0则说明连接DLL成功,否则可能就是DLL没有注册成功,需要重新注册一下(注册是时候最好先反注册一下)

    li_cel 注册状态为1则说明注册成功

    OLEObject.DisConnectObject()释放资源要放在调用DLL类库的函数之后,否则会接收不到该函数的返回值

    所有需要的文件(C#的dll文件和tlb文件,regasm.exe)要放在工程的根目录下,且这几个文件要放在同一目录下

    展开全文
  • PB调用C#编写DLL

    千次阅读 2018-06-27 14:08:19
    PB调用C#编写DLLC#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了它进一步的...

    PB调用C#编写的DLL

    C#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了它进一步的发展,这个就不多说了,玩PB的朋友都清楚.PB如何调用C#写的DLL,这个兴趣一上来,就忍不住要解决它.经过多方查找资料加上自己写代码测试,算是解决这个难题.下面列出开发步骤及各种设置选项(开发工具VS2008SP1+PB9.0-8836)

         首先我们打开VS2008,新建一个项目,如图

    接着我们双击解决方案下面的属性文件夹[Properties],系统将打开类型的属性设置窗口,选择[应用程序]

    点击程序集信息按钮,弹出信息窗口,选中[使程序集COM可见],如图

    接下来选择[生成]标签 ,选中[为COM互操作注册]

    选择[签名]标签,选中[为程序集签名]-->[选择强名称密钥文件]-->[新建],输入你的密钥名称,去掉[使用密码保护密钥文件],如图

    OK,到这里配置完成,下面给出代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Security.Cryptography;
    using System.IO;
    using System.Web.SessionState;
    using System.Runtime.InteropServices;

    namespace encry
    {
        [Guid("FF6B4D57-F34E-49ec-9A3B-D0A17B59F78A")]
        public interface IEncryption
        {
            [DispId(1)]
            string EncryptString(string encryptString, string encryptKey);
            [DispId(2)]
            string DecryptString(string decryptString, string decryptKey);
            [DispId(3)]
            string md5(string str, int code);
        }

        [Guid("531D2D13-11DE-41a8-A788-CB51B5642CCE"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IEncryption))]
        public class encryption : IEncryption
        {
            #region "3des加密字符串"
            /// <summary>
            /// DES加密字符串
            /// </summary>
            /// <param name="encryptString">待加密的字符串</param>
            /// <param name="encryptKey">加密密钥,要求为8位</param>
            /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
            public string EncryptString(string encryptString, string encryptKey)
            {
                try
                {
                    byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
                    byte[] rgbIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
                    byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
                    DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
                    MemoryStream mStream = new MemoryStream();
                    CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                    cStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cStream.FlushFinalBlock();
                    return Convert.ToBase64String(mStream.ToArray());
                }
                catch
                 {
                    return encryptString;
                }
            }
            #endregion

            #region "3des解密字符串"
            /// <summary>
            /// DES解密字符串
            /// </summary>
            /// <param name="decryptString">待解密的字符串</param>
            /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
            /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
            public string DecryptString(string decryptString, string decryptKey)
            {
                try
                {
                    byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey.Substring(0, 8));
                    byte[] rgbIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
                    byte[] inputByteArray = Convert.FromBase64String(decryptString);
                    DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
                    MemoryStream mStream = new MemoryStream();
                    CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                    cStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cStream.FlushFinalBlock();
                    return Encoding.UTF8.GetString(mStream.ToArray());
                }
                catch
                {
                    return decryptString;
                }
            }

            #endregion

            #region "MD5加密"
            /// <summary>
            /// MD5加密
            /// </summary>
            /// <param name="str">加密字符</param>
            /// <param name="code">加密位数16/32</param>
            /// <returns></returns>
            public string md5(string str, int code)
            {
                string strEncrypt = string.Empty;
                if (code == 16)
                {
                    strEncrypt = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").Substring(8, 16);
                }

                if (code == 32)
                {
                    strEncrypt = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5");
                }

                return strEncrypt;
            }
            #endregion
        }
    }

    生成一下,在你的程序目录下面bin文件夹下有一个debug文件夹,生成的DLL就在里面.这个时候pb还不能调用这个DLL.

    在这里说明一下,代码里面的GUID是怎样生成的.

    打开你的VS2008命令提示,如图

    输入[guidgen],按下回车

    选着选项4,注册格式,点击[New GUID],将生成新的序列号,点击[Copy]复制序列号,粘贴的时候记得将前后的花括号去掉

    要想pb能够调用这个DLL,关键在于要注册这个DLL,注册过程如下,打开VS2008命令提示,打开你的DLL所在的路径,然后输入如下命令

    regasm 你的DLL名称.DLL /tlb:你的DLL名称.tlb,看图

    如果成功注册将会出现上面的画面.

    接上来是我们PB如何调用这个DLL了.看下图(调用方式为OLE)

     

     

    增加一个实例变量

    OLEObject encryption

    在窗体的Open()事件里面写下以下代码

    encryption = Create OLEObject
    encryption.ConnectToNewObject("encry.encryption")

    "encry" 是你C#写的DLL的命名空间的名称

    "encryption"是你的DLL的类名称.别搞错了.

    在[执行MD5加密]的按钮脚本写如下代码

    long  ll_status
    string ls_text
    string ls_dotext

    ls_text = sle_1.Text
    ls_dotext = encryption.md5(ls_text,32)
    sle_2.Text = ls_dotext

    如果一切OK的话,会出现下面的画面

    至此,程序结束.可以跟大家共同参考,学习.

    展开全文
  • PB调用C++DLL

    2015-09-08 14:55:24
    PB调用C++DLL问题,测试例子中是, 调用C++的char*参数的小例子
  • PB调用C#编写Dll类库

    2019-10-09 04:37:03
    前言:c#中写的dll直接是不能被pb调用的,只有写成com组件才可以调用,所以用c#写dll时要注意。 c#中新建类库  类库类型为通用类库,项目名为AddCom 1、配置:右键点击解决方案资源管理器中的AddCom,选择...

    在c# 中编写com组件,供PB调用实例

    前言:c#中写的dll直接是不能被pb调用的,只有写成com组件才可以调用,所以用c#写dll时要注意。

    c#中新建类库

      类库类型为通用类库,项目名为AddCom

     

    1、配置:右键点击解决方案资源管理器中的AddCom,选择“属性”,选择“应用程序”->“程序集信息”,勾选“使程序集COM可见”,然后点击“生成”,选择“为COM互操作注册”

     

    2、打开AssemblyInfo.cs文件,设置[assembly: ComVisible(true)],如果不改则不能被其他程序调用

     

    3、编写com组件会用到guid(全球唯一ID),编写com组件必须要用到。c#会默认生成一个放在AssemblyInfo.cs,如没有生成,可以用GUID生成器生成,也可以网上下一个生成guid的软件

    4、c#中源代码如下

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    namespace AddCom
    {
        [Guid("298D881C-E2A3-4638-B872-73EADE25511C")]
        public interface AddComInterface
        {
            [DispId(1)]
            int iadd(int a, int b);
        }
        [Guid("2C5B7580-4038-4d90-BABD-8B83FCE5A467")]
        [ClassInterface(ClassInterfaceType.None)]
    
        public class AddComService : AddComInterface
        {
            public AddComService()
            {
            }
            public int iadd(int a, int b)
            {
                int c = 0;
                c = a + b;
                return c;
            }
        }
    }

    至此,关于C#的Dll已经操作完成,下面开始注册

    注册DLL

    注册有两种方法

    1、C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe E:\Test\MyLib.dll /tlb: E:\Test\MyLib.tlb

    反注册:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /u E:\Test\MyLib.dll /tlb: E:\Test\MyLib.tlb

    (   这个地址是安装Framework的物理地址,根据自己电脑不同进行修改)得到下面图所示即成功注册

    2、run("regasm MyLib.dll /tlb: MyLib.tlb",minimized!)

    前提是把regasm.exe文件复制到当前项目中

    PB调用DLL

    pb中利用ole调用来调用com组件

    OLEObject OLEObject 
    long li_status
    int li_reg
    int li_cel
    
    string a = "aa"
    string b = "bb"
    
    //创建OLEObject对象
    OLEObject = Create OLEObject
    //创建连接
    li_status= OLEObject.ConnectToNewObject("RakbLibrary.Class1")
    
    if li_status<>0 then
        
        //连接不成功,先反注册组件,再重新注册组件
        li_cel = run("regasm /u RakbLibrary.dll /tlb:RakbLibrary.tlb",minimized!)
        if li_cel <> 1 then
            messagebox('提示','反注册失败!')
            return
        
        else
            messagebox('提示','反注册成功!')
            
            li_reg = run("regasm RakbLibrary.dll /tlb:RakbLibrary.tlb",minimized!)
            if li_reg<>1 then
                messagebox('提示','组件注册失败!')
                return
            else
                messagebox('提示','组件注册成功!')
            end if
        end if
    else
        //调用类内的公共函数
     li_res = OLEObject.getForm(a,b)
    end if
    //释放资源
    OLEObject.DisConnectObject()

    如果返回值是-3 ,Object could not be created   生成exe执行文件就好了

    注意:li_status 连接状态是0则说明连接DLL成功,否则可能就是DLL没有注册成功,需要重新注册一下(注册是时候最好先反注册一下)

       li_cel 注册状态为1则说明注册成功 

    OLEObject.DisConnectObject()释放资源要放在调用DLL类库的函数之后,否则会接收不到该函数的返回值

      所有需要的文件(C#的dll文件和tlb文件,regasm.exe)要放在工程的根目录下,且这几个文件要放在同一目录下

    转载于:https://www.cnblogs.com/Violety/p/11286902.html

    展开全文
  • C++ 6编写PB调用DLL

    2017-10-03 06:37:08
    PB调用代码 声明 function boolean test(string x,ref string y) library "test.dll" 按钮 string x,y y = space(255) boolean z x='test' z = test(x,y) messagebox('提示',y) dll功能 使y=x return true
  • 编写一般的DLL方法相同,需要注意以下两点: (1)调用约定 c函数有_stdcall、_cdecl、_fastcall等多种调用约定,调用约定...编写PB调用DLL,请使用_stdcall调用约定,如下所示: extern "c" _declspec(DLLex...

    编写一般的DLL方法相同,需要注意以下两点:

    (1)调用约定

    c函数有_stdcall、_cdecl、_fastcall等多种调用约定,调用约定用来说明函数参数的压栈顺序和由谁(函数自身还是调用者)来修改堆栈。关于调用约定的详细说明,请参考我转载的另一篇文章。

    编写供PB调用DLL,请使用_stdcall调用约定,如下所示:

    extern "c" _declspec(DLLexport) int _stdcall GetInt(char* name)


    (2)def文件
    在Vc++中,如果生成DLL可以不使用.def文件,只需要在Vc++的函数定义前加__declspec(DLLexport)修饰就可以了。生成的DLL Vc++用户可以直接使用,但PB、VB等用户使用会遇到函数名转换的问题。因为Vc++对于__declspec(DLLexport)声明的函数会进行名称转换,如下面的函数:

    __declspec(DLLexport) int _stdcall GetStr()

     编译后会转换为 GetStr@0,这样在PB、VB中声明函数时应该声明GetStr@0,
    如果函数带有参数,转换后的函数名将更加复杂,这使PB、VB用户使用起来很不方便。在def文件中由EXPORT输出函数可解决这个问题。
    DLL要输出如下两个函数:
    extern "c" _declspec(DLLexport) int _stdcall GetInt(char* name);
    extern "c" _declspec(DLLexport) char* _stdcall GetStr(int id);

    则def文件书写如下(TEST为工程名):
    LIBRARY      "TEST"
    DEScRIPTION  'TEST Windows Dynamic Link Library'

    EXPORTS
        ; Explicit exports can go here
    GetInt @1
    GetStr @2  

    编译生成DLL后,在PB中要调用GetStr函数,只需做如下声明即可:


    function string GetStr(int a) library("TEST.DLL");

    注意,如果您建的是Win32 Dynamic-Link Library 工程,def文件需要自己创建,然后把它加入工程,def文件名需和工程名相同。如您的工程名为test,则创建test.def。

     

     

    转载于:https://www.cnblogs.com/babietongtianta/p/3142834.html

    展开全文
  • pb调用dll实例

    热门讨论 2013-03-12 14:14:15
    (5)DLL独立于编程语言,大多数WINDOWS编程环境都允许主程序调用DLL中的函数。即可以用VC++、VB、PowerBuilder、Delphi、汇编语言等建立DLL,然后在不同语言编制的应用程序中调用它。下面用一个实例说明通过DLL实现...
  • PB定义结构体 这里INT,LONG,STRING ,CHAR都试过了 global type absolutetime from structure int century int year int month int day int hour int minute int second int sec_fractions ...
  • 如何用VC编写PB调用DLL (转)

    千次阅读 2010-06-09 06:04:00
    如何用VC编写供PB调用的DLL[转帖]2008-11-01 12:40VC PB dll和编写一般的DLL方法相同,需要注意以下两点:...编写PB调用DLL,请使用_stdcall调用约定,如下所示:extern "C" _declspec(dllexport) int _stdcall GetIn
  • 这个时候发现单纯用pb来做无法完成(至少目前我没有找到简便的方法,知道的兄弟可以留言告知下),所以想用c#编写一个类库专门用于画线,同时也学习一下c#类库制作的相关流程,特此记录,以备后期查询使用。...
  • 备忘:PB调用c++ dll

    千次阅读 2017-05-23 14:48:03
    通过查阅资料得知,PB调用dll中,需要以_stdcall来声明外部接口,且需要编写.def文件。因为VC++对于__declspec(dllexport)声明的函数会对函数名尾附加函数在DLL中的地址。 且在Dll中定义的接口函数,如
  • 共有PB 两部分代码,Dll制作的demo ,与调用C#dll,自身的dll的demo; C# 代码两部分,生产dll ,调用dll .
  • C#编写PB可用的dll方法 例子是Gzip 使用的是ICSharpCode.SharpZipLib.dll的方法
  • pb调用vc dll约定

    2015-06-02 14:00:44
    VC PB dll VC6中的函数调用约定:  调用约定 堆栈清除 参数传递  __cdecl 调用者 从右到左,通过堆栈传递  __stdcall 函数体 从右到左,通过堆栈传递  __fastcall 函数体 从右到左,优先使用寄
  • 大家好,最近做接口遇到了这个问题,DLL是用PB写的,我调用里面的函数。定义如下: ------------------------------------------------------------------------------------------------------- 函数定义: ...
  • powerbuilder 程序开发过程,经常会调用一些外部函数(dll库函数),本文介绍 vc++如何编写pb可以调用dll库函数。 示例使用IDE:microsoft visual studio 2017 一、创建一个动态链接库(DLL)项目。 二、编写...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,430
精华内容 972
关键字:

pb可以调用的dll编写