gpt4 book ai didi

c++ - 如何在不通过 COM 的情况下从 VB6 调用 C++ DLL?

转载 作者:行者123 更新时间:2023-11-30 03:09:46 25 4
gpt4 key购买 nike

好的,所以我有一个编译为 DLL 文件的 C++ 项目。我能够在 C# 中引用此文件并查看/使用 DLL 文件中的所有对象和函数。我需要做的是通过 VB6 引用这些对象和函数。

C++ 代码中没有任何内容看起来像是在创建 DLL。没有“__declspec(dllexport)”修饰符,只有 C++ 代码。

有这样的对象:

String ^
Array^

我不完全确定它们是什么。我对 C++ 的了解不是很广泛,我只为 Linux 系统用 C++ 编写过代码,尽管从用法上看它们有点像指针。这些对象与 C++ 中的 DLL 有什么关系吗?

无论如何,我可以添加我需要的任何包装器或添加一个定义文件 (.def),尽管我不知道要使用什么包装器,也不知道定义文件如何工作或需要如何构建它.

感谢任何帮助和/或建议。如果您也可以向我推荐一些好的信息,那将很有帮助。我所做的所有搜索都没有帮助。

请记住,我需要从 VB6 访问此 C++ DLL 中的所有函数和对象。

谢谢。

编辑:向问题添加了 .h 文件和 AssemblyInfo.cpp 规范

我更改了这些文件中的一些名称,但结构是一样的。请注意,这引用了其他文件,但我假设如果可以使一个文件正常工作,那么其他文件也可以使用相同的过程。我可以看到每个对象,只是看不到方法:

//myDBObject.h
#pragma once
using namespace System;
namespace myDBNamespace {

#include "ProblemSolution.h"

public ref class MyDataBaseAccessor
{
public:
MyDataBaseAccessor();

static String ^ GetServiceVersion() { return sDLLVersion;};
int GetServiceStatus() { return myiDBStatus;};
String ^ GetMyVersion();
String ^ GetDBVersion();
String ^ GetDLLVersion();
String ^ GetExpireDate();

MyOtherObject ^ GetMyOtherObject();

int ProcessProblem(ProblemSolution ^ dsps);

private:
static MyDataBaseController ^ myDataBase;
static MyOtherObject ^ myObjs;
static MyDataset ^ myDS;
static String ^ myDBPath;

static String ^ sDLLVersion = "0.01";
static String ^ sReqDBVer = "0.01";
static int myiDBStatus;
static bool myBoolean, myOtherBoolean, mybNoChain;

};
}

这是 AssemblyInfo.cpp 文件:

#include "stdafx.h"

using namespace System;
using namespace System::Reflection;
using namespace System::Runtime::CompilerServices;
using namespace System::Runtime::InteropServices;
using namespace System::Security::Permissions;

//
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
//
[assembly:AssemblyTitleAttribute("My Product Title")];
[assembly:AssemblyDescriptionAttribute("")];
[assembly:AssemblyConfigurationAttribute("")];
[assembly:AssemblyCompanyAttribute("My Company")];
[assembly:AssemblyProductAttribute("My Product Name")];
[assembly:AssemblyCopyrightAttribute("My Copyright")];
[assembly:AssemblyTrademarkAttribute("My Program")];
[assembly:AssemblyCultureAttribute("")];

//
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the value or you can default the Revision and Build Numbers
// by using the '*' as shown below:

[assembly:AssemblyVersionAttribute("1.0.*")];

[assembly:ComVisible(true)]; //Here is the ComVisible tag. It was false and I set it to true

[assembly:CLSCompliantAttribute(true)];

[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = false)];

最佳答案

I'm not entirely sure what they are.

您不是在看 C++ 代码,而是在看 C++/CLI 代码,这是一种针对托管 .NET 平台的语言。这也是您可以在 C# 中轻松使用此 DLL 的原因。

老实说,如果您想在 Visual Basic 6 中使用托管对象,COM Interop 是您的最佳选择。创建包装器或通过 COM Interop 直接公开包含在 DLL 中的对象。

编辑:

基本上,您通过使用属性来公开对象,即您在源代码中使用属性注释您的类型。这些记录在此处:System.Runtime.InteropServices

看看: Introduction to COM Interop

此外,COM Interop“圣经”是 Adam Nathan 的这本书:.NET and COM: The Complete Interoperability Guide

还有一篇文章介绍如何公开 COM 对象并在 VB6 中使用它:http://www.15seconds.com/issue/040721.htm

关于c++ - 如何在不通过 COM 的情况下从 VB6 调用 C++ DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3843350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com