gpt4 book ai didi

c# - MAPI 链接静态库 (LNK2019 : Unresolved External Symbol)

转载 作者:行者123 更新时间:2023-11-28 04:43:04 26 4
gpt4 key购买 nike

我尝试在 Visual Studio 2017 中使用 Microsoft 的 MAPI(扩展 MAPI)。

所以首先我创建了一个包含 3 个项目的解决方案:

  1. Visual C++ - Windows 桌面 - 静态库
  2. Visual C++ - CLR - 类库
  3. Visual C# - 经典 Windows 桌面 - WPF 应用

(1)设置如下:

stdafx.h

#pragma once

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN

// Not auto generated
#define DLLEXPORT __declspec(dllexport)

实例管理器.h

#pragma once

namespace NativeWrapper
{
class DLLEXPORT InstanceManager
{
public:
InstanceManager();
int Init();
void UnInit();
~InstanceManager();
private:
bool _Initialized;
};
}

实例管理器.cpp

#pragma once
#include "stdafx.h"
#include "InstanceManager.h"

namespace NativeWrapper
{
InstanceManager::InstanceManager()
{
_Initialized = false;
}

int InstanceManager::Init()
{
if (!_Initialized)
{
MAPIINIT init = {
MAPI_INIT_VERSION,
MAPI_MULTITHREAD_NOTIFICATIONS
};
return MAPIInitialize(&init);
}
}

void InstanceManager::UnInit()
{
if (_Initialized)
{
MAPIUninitialize();
}
}

InstanceManager::~InstanceManager()
{
UnInit();
}
}

我还下载了 MAPI 开发所需的 header 并引用通过将相应的路径 (C:\Office 2010 Developer Resources\Outlook 2010 MAPI Headers) 添加到其他包含目录来实现它们。

(2)设置如下:

实例管理器.h

#pragma once

#include "..\StaticLib1\NativeInstanceManager.h"

namespace MAPIManaged
{
ref class InstanceManager
{
public:
InstanceManager();
~InstanceManager();
int Init();
void UnInit();
private:
NativeWrapper::InstanceManager* _NativeObject;
};
}

实例管理器.cpp

#include "stdafx.h"
#include "InstanceManager.h"

namespace MAPIManaged
{
InstanceManager::InstanceManager()
{
_NativeObject = new NativeWrapper::InstanceManager();
}

InstanceManager::~InstanceManager()
{
delete _NativeObject;
}

int InstanceManager::Init()
{
return _NativeObject->Init();
}

void InstanceManager::UnInit()
{
_NativeObject->UnInit();
}
}

还有关于 (1) 的项目引用。我是通过右键单击项目 2 并添加项目 1 来完成的。

(3)设置如下:

using System.Windows;

namespace WpfApp1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

var obj = new MAPIManaged.InstanceManager();
obj.Init();
}
}
}

还有关于 (2) 的项目引用。我是通过右键单击项目 3 并添加项目 2 来完成的。

错误

虽然我引用了静态库,但我遇到了以下错误:

错误一:MapUninitialize链接错误

Error LNK2019 unresolved external symbol "_MAPIUninitialize@0"
in function ""public: void __thiscall NativeWrapper::InstanceManager::UnInit(void)" (?UnInit@InstanceManager@NativeWrapper@@QAEXXZ)".
ClassLibrary1 PATH\WrapNative\ClassLibrary1\StaticLib1.lib(InstanceManager.obj) 1

错误2:MapInitialize链接错误

    Error LNK2019 unresolved external symbol "_MAPIInitialize@4"
in function ""public: int __thiscall NativeWrapper::InstanceManager::Init(void)" (?Init@InstanceManager@NativeWrapper@@QAEHXZ)".
ClassLibrary1 PATH\WrapNative\ClassLibrary1\StaticLib1.lib(InstanceManager.obj) 1

最佳答案

您永远不应静态链接到任何 MAPI 函数 - 您必须首先找到正确的 MAPI dll 并使用 LoadLibrary/GetProcAddress。

查看MFCMAPI source code有关如何完成此操作的示例。

关于c# - MAPI 链接静态库 (LNK2019 : Unresolved External Symbol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49819573/

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