我正在尝试从DLL导出全局变量.
foo.h中
class Foo
{
public:
Foo()
{}
};
#ifdef PROJECT_EXPORTS
#define API __declspec(dllexport)
#else
#define API __declspec(dllimport)
#endif
API const Foo foo;
Run Code Online (Sandbox Code Playgroud)
Foo.cpp中
#include "Foo.h"
const Foo foo;
Run Code Online (Sandbox Code Playgroud)
当我编译上面的代码时,Visual Studio抱怨:
foo.cpp(3):错误C2370:'foo':重新定义; 不同的存储类1> foo.h(14):看'foo'的声明
如果我使用:
external const Foo foo;
Run Code Online (Sandbox Code Playgroud)
在Foo.h中,编译器很高兴,但DLL不会导出符号.我设法导出有问题的函数,但变量似乎没有相同的方式...任何想法?
我在Windows平台上安装了PyQt5并获得了importError:DLL加载失败.
我已经使用命令安装了pyqt5
pip3 install pyqt5
Successfully installed pyqt5-5.8.1
Run Code Online (Sandbox Code Playgroud)
我的Python版本如下:
Python 3.5.2 |Anaconda custom (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32
Run Code Online (Sandbox Code Playgroud)
导入错误如下:
from PyQt5.QtWidgets import QApplication
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: DLL load failed: The specified module could not be found.
Run Code Online (Sandbox Code Playgroud)
感谢和问候
我可以在DLL中放一个类吗?我写的课是这样的:
class SDLConsole
{
public:
SDLConsole();
~SDLConsole(){};
void getInfo(int,int);
void initConsole(char*, char*, SDL_Surface*, int, int, int);
void sendMsg(char*,int, SDL_Surface*);
void cls(SDL_Surface*);
private:
TTF_Font *font;
SDL_Surface *consoleImg;
int width, pos, height, line, size, ctLine;
SDL_Surface* render(char*,int);
};
Run Code Online (Sandbox Code Playgroud)
我知道如何加载DLL并在DLL中使用该函数,但是如何在DLL中放置一个类?非常感谢你.
你知道一个软件从一个本机DLL自动生成C#代码(在.cs中有[DllImport]属性),以便在C#代码中使用这个DLL吗?
我正在尝试访问一个非托管库,很幸运能够访问API的综合指南.
不幸的是,我不知道C++的WORD类型是什么.同样,我不知道DWORD会是什么.
我们正在编写一个代码,使用Windows Defender API对C#中的文件进行按需扫描.
[DllImport(@"C:\Program Files\Windows Defender\MpClient.dll")]
public static extern int WDStatus(out bool pfEnabled);
[DllImport(@"C:\Program Files\Windows Defender\MpClient.dll")]
public static extern int MpManagerOpen(uint dwReserved, out IntPtr phMpHandle);
[DllImport(@"C:\Program Files\Windows Defender\MpClient.dll")]
public static extern int MpScanStart(IntPtr hMpHandle, uint ScanType, uint dwScanOptions, IntPtr pScanResources, IntPtr pCallbackInfo, out IntPtr phScanHandle);
[DllImport(@"C:\Program Files\Windows Defender\MpClient.dll")]
public static extern int MpHandleClose(IntPtr hMpHandle);
private void DoDefenderScan_Click(object sender, EventArgs e)
{
try
{
bool pfEnabled;
int result = WDStatus(out pfEnabled); //Returns the defender status - It's working properly.
ErrorHandler.ThrowOnFailure(result, VSConstants.S_OK); …Run Code Online (Sandbox Code Playgroud) 我想基于dll导出的类定义派生类.基类在项目A中定义,派生类在项目B中定义.
首先,在项目A中,定义了预处理器MYDLL_BUILD.我使用头文件来指定导出/导入:
#if !defined(MYDLL_BUILD)
# pragma comment(lib, "myDll.lib")
#endif
#if defined(MYDLL_BUILD)
# define MYDLL_API __declspec(dllexport)
#else
# define MYDLL_API __declspec(dllimport)
#endif
Run Code Online (Sandbox Code Playgroud)
然后我定义基类:
class MYDLL_API DllObject
{
public:
virtual ~DllObject() {}
protected:
DllObject() { m_count = 3; }
private:
int m_count;
};
Run Code Online (Sandbox Code Playgroud)
在项目B中,未定义预处理器MYDLL_BUILD.这是派生类:
class MyClass : public DllObject
{
public:
~MyClass(){}
MyClass() { m_data = 20; }
private:
int m_data;
};
Run Code Online (Sandbox Code Playgroud)
我已经包含了dll和lib文件,但仍然得到了未解析的外部符号错误:
2>Test_Entry.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall ADAI::DllObject::~DllObject(void)" (__imp_??1DllObject@ADAI@@UAE@XZ) referenced in function "public: virtual __thiscall …Run Code Online (Sandbox Code Playgroud) 我意识到我必须DllImport使用perlembed方法
perl_parse
perl_alloc
perl_free
Run Code Online (Sandbox Code Playgroud)
等等.,
但不确定如何使用函数参数来DLLImport特别使用perl_parse方法.
我也意识到一个相关的问题已经存在,几乎存在,但OP仍然通过创建一个C包装器然后在C#中使用它来解决.
他说他无法DLLimport PERL_SYS_INIT3.
所以我的问题是如何只使用C#正确包装它们并使用它?
我在MSDN文档中注意到有多种方法可以在VB.NET程序中声明对外部DLL中函数的引用.
令人困惑的是,MSDN声称你只能在极少数情况下使用DllImportAttribute类和共享函数原型,但是我找不到这个语句的解释,而你可以简单地使用关键字.Declare
为什么这些不同,我会在哪里适当地使用每个案例?
我的C#/ SQLite工作正常,直到我决定更新SQLite DLL(从1.0.82.0到1.0.84.0).现在我遇到了这个崩溃:
无法在DLL"SQLite.Interop.dll"中找到名为"sqlite3_changes_interop"的入口点
A first chance exception of type 'System.EntryPointNotFoundException' occurred in System.Data.SQLite.dll
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unhandled exception</Description><AppDomain>SparkleShare.vshost.exe</AppDomain><Exception><ExceptionType>System.EntryPointNotFoundException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Unable to find an entry point named 'sqlite3_changes_interop' in DLL 'SQLite.Interop.dll'.</Message><StackTrace> at System.Data.SQLite.UnsafeNativeMethods.sqlite3_changes_interop(IntPtr db)
at System.Data.SQLite.SQLite3.get_Changes()
at System.Data.SQLite.SQLiteStatement.TryGetChanges(Int32&amp; changes)
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
Run Code Online (Sandbox Code Playgroud)
代码没有改变,所以我不认为这是一个代码问题(无论如何,这是它发生的行).
我下载的新版本有什么问题吗?我在http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wikisqlite-netFx40-static-binary-Win32-2010-1.0.84.0.zip的Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 4.0)段落中下载了
编辑:我恢复到以前的DLL,但问题仍然发生,可能是因为Visual C#在某处无法清理某些缓存.