【问题标题】:Run and compile vba script in visual studio在 Visual Studio 中运行和编译 vba 脚本
【发布时间】:2016-11-07 12:22:26
【问题描述】:

我在 VBA 上使用宏已经有一段时间了,我想隐藏一些关于它们的信息。由于 excel 是一种非常不安全的语言,我想到了创建一个已编译脚本的 .exe 文件以避免人们访问我的代码。 我一直在寻找使用 Visual Studio 执行此操作的方法,但无法得到答案。 有人可以告诉我如何做到这一点吗? 非常感谢提前:)

【问题讨论】:

  • 我不知道这是否能解决您的问题,但也许您可以使用插件?见Create Excel 2007 vsto add in
  • @Stefan 谢谢你的回答。我已经从您的链接开始进行了一些研究,我想我会发现它很有用。我还没有对其进行测试,但这是我一直在寻找的起点。 =D
  • 好的,很高兴听到这个消息。如果你找到你要找的东西,分享你的知识。 ;)
  • 感谢您的支持,但恐怕最终没有帮助......即使我仍然有同样的问题,我可以告诉我我的进步......我'正在尝试找到一种方法来使用 Visual Studio 创建我的 VBA 脚本的 .DLL 文件。我完全是 VS 的新手,所以......这并不容易......

标签: visual-studio excel compilation macros vba


【解决方案1】:

我不认为您可以使用 vba 创建 EXE/DLL。 EXE/DLL 是已编译的程序集,因此您需要可以编译的编程语言/环境。已编译的意思是“预翻译成机器语言”。 VBA 只是一种解释性语言,这意味着它将在 VBA 环境中即时翻译。我认为你必须使用 C#、C++ 等来做到这一点。如需更多信息,请参阅:

Create a DLL using VBA editor

http://www.geeksengine.com/article/create-dll.html

https://msdn.microsoft.com/en-us/library/dt232c9t(VS.80).aspx

您可以在不创建 DLL 的情况下锁定和隐藏您的 VBA 代码:

http://www.excel-easy.com/vba/examples/protect-macro.html

http://www.ozgrid.com/VBA/protect-vba-code.htm

Best way to protect Excel VBA code?

但我不确定这是否能解决您的问题:您说,excel VBA 似乎是一种不安全的语言。我不确定我是否明白你的意思。如果您只想隐藏脚本的内容,请参见上文。到目前为止,这将比其他版本的 excel 更好地保护您的代码。但我认为仍然有办法解决这个问题,例如。 G。蛮力攻击等。通常这是增强的方法,但如果你想确定你(或者更好的有经验的程序员必须为此创建一个程序(exe)。如果安全意味着不同的东西(你为什么要隐藏你的代码? )而不是让我知道,也许还有其他方法可以实现您想要做的事情。

【讨论】:

  • 非常感谢您的回答,非常感谢。我将进一步查看您发送给我的链接,我现在没有太多时间......我的意思是不安全的是您可能已经注意到,这些使用密码保护 vba 代码的方法非常容易闯入。我目前正在从数据库中导入数据,所以数据库 IP:port 和 ID 和 PASS 都在脚本上,这是完全不能接受的。它是供企业内部使用的,但您知道...安全总比抱歉...
  • 我了解编译语言和解释语言之间的区别......但是,到目前为止,我的所有工作都是在 VBA 中完成的,所以......改变代码的编程方式真的很乏味......这就是为什么我正在考虑在与数据库的连接部分创建 .DLL 的可能性,这样所有功能都可以正常工作,而 UserID 和 PASSWORD 在编译部分是安全的。我希望我能很好地解释我的问题,以便你能理解我。正如我所说,我会看看你发给我的链接,我希望我能得到一个好的结果。如果有的话我会告诉你的!
  • 是的,当然,我知道你的意思。到目前为止,我还没有在 vba 中开发自己的 dll。但据我了解链接应该可以只移动部分功能。一种可能是您创建了一个类似代理的 dll。我发现以下帖子可以帮助您http://stackoverflow.com/questions/3217014/how-to-securely-store-connection-string-details-in-vba
  • 好吧,斯特凡……你是神!该链接对我来说非常有用!我不得不调整一些东西,但功能是完美的!我会将代码作为答案发布,以便其他人可以使用它,以防他们遇到同样的问题。
  • 感谢您的鲜花! :) 很高兴听你这样说。是啊,那样最好了! :)
【解决方案2】:
using ADODB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace HiddenConnectionString
{
[InterfaceType(ComInterfaceType.InterfaceIsDual),
Guid("2FCEF713-CD2E-4ACB-A9CE-E57E7F51E72E")]
public interface IMyServer
{
    Connection GetConnection();
    void Shutdown();
}

[ClassInterface(ClassInterfaceType.None)]
[Guid("57BBEC44-C6E6-4E14-989A-B6DB7CF6FBEB")]
public class MyServer : IMyServer
{
    private Connection cn;

    private string cnStr = "Provider=MSDAORA.1;Password=YourPass;User ID=YourID;Data Source=YourServer";
    public MyServer()
    {

    }

    public Connection GetConnection()
    {
        cn = new Connection();
        cn.ConnectionString = cnStr;
        cn.Open();
        return cn;
    }

    public void Shutdown()
    {
        cn.Close();
    }
}
}

您可能会收到此错误...这是因为 InterfaceType Guid

访问被拒绝。 (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED)) 检查此链接以获取解决方案:

https://social.msdn.microsoft.com/Forums/en-US/26accc30-9cfb-4d86-9c27-780f51929ecb/access-is-denied-exception-from-hresult-0x80070005-eaccessdenied?forum=vsreportcontrols

这是代码,但我会访问 Stefan 建议的链接。

【讨论】:

    猜你喜欢
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多