相关疑难解决方法(0)

为何/何时不需要__declspec(dllimport)?

在使用server.dll和client.exe的项目中,我dllexport从服务器dll编辑了一个服务器符号,而不是将其 dllimport编辑到客户端exe中.

仍然,应用程序链接,并启动,没有任何问题.是dllimport不需要的,那么???

细节:

我有这个'服务器'DLL:

// server.h
#ifdef SERVER_EXPORTS
  #define SERVER_API __declspec(dllexport)
#else
  #define SERVER_API // =====> not using dllimport!
#endif
class  SERVER_API CServer {
   static long s;
   public:
   CServer();
};

// server.cpp
CServer::CServer(){}

long CServer::s;
Run Code Online (Sandbox Code Playgroud)

这个客户端可执行文件

#include <server.h>
int main() {
   CServer s;
}
Run Code Online (Sandbox Code Playgroud)

服务器命令行:

cl.exe /Od  /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" 
 /D "SERVER_EXPORTS" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" 
 /Gm /EHsc /RTC1 /MDd /Yu"stdafx.h" 
 /Fp"Debug\server.pch" /Fo"Debug\\" /Fd"Debug\vc80.pdb" 
 /W3 /nologo …
Run Code Online (Sandbox Code Playgroud)

c++ dllimport visual-c++-2005 declspec

37
推荐指数
1
解决办法
9279
查看次数

dllexport/dllimport开关的宏

#if COMPILING_DLL
    #define DLLEXPORT __declspec(dllexport)
#else
    #define DLLEXPORT __declspec(dllimport)
#endif
Run Code Online (Sandbox Code Playgroud)

我如何/在哪里定义COMPILING_DLL

在这里看到: __ declspec(dllimport)究竟意味着什么?

听起来我不能使用加载时动态链接,如果我不能使用相同的标题?

在此输入图像描述

c++ visual-studio-2010 visual-c++

8
推荐指数
2
解决办法
2万
查看次数

"私有数据"在VMMAP中定义了什么?

我正在使用VMMap来分析混合模式(托管和非托管)应用程序中的虚拟/进程地址空间利用率.我了解Windows VMM和虚拟内存API的工作原理,我也了解堆内存API的工作原理.我已经看过我正在使用的CRT实现(不是非常详细)和(我想我 - 这可能是我的堕落)了解它如何使用前面提到的Win32 API.

我想了解这个"私人数据"统计数据给我看的内容.我的应用程序不直接调用任何Win32内存API函数,它只在本机C++中使用"malloc/new",在C#中使用"new"(深入使用Win32内存管理API).

VMMap给出的"私有数据"的定义是:

私有内存是由VirtualAlloc分配的内存,不是由堆管理器或.NET运行时子分配的.它不能与其他进程共享,根据系统提交限制收费,并且通常包含应用程序数据.

所以我想这个定义让我问,好吧,那么谁在调用VirtualAlloc呢?它是堆管理器还是.Net运行时?

我可以得到一些已提交的私有数据的地址,并使用WinDbg找出....嗯......事实证明,微软在他们的智慧中扼杀了ntdll公共符号,所以WinDbg不能很好地工作 - 我如果需要,可以提供更多关于此的详细信息,但基本上命令如!address -summary由于缺少符号而不再起作用.

提出这个问题的另一种方法可能是:我可以编写哪些C++或C#代码会导致此私有数据统计数据增加或减少?或者这一切都是由操作系统,C++运行时或.Net运行时管理的,因此受到它的突发奇想?

我可以从VMMap的性质(其他内存类型是唯一的其他内容)推断出这个"私有数据",因此不能是以下任何类型的地址空间:

  • 堆(请注意,这包括已提交的和保留的堆空间 - 通过调用VirtualAlloc保留,如上面的私有数据描述中所述).
  • 管理堆
  • 可共享
  • 映射文件
  • 图片
  • 页表
  • 不可用
  • 自由

(我找不到一个在线帮助文​​件,它定义了VMMap认为上述所有类型的内容,但是这里有一个下载帮助文件的链接:https://technet.microsoft.com/en-us/library/dd535533.aspx)

我注意到在我的应用程序中,私有数据的TOTAL(保留和提交)大小在我的应用程序生命周期内保持相当稳定,尽管堆/管理堆/堆栈大小按预期更改.我还注意到私有数据使用的总量约为250Mb,实际上只提交了~33Mb.请注意我的测量方法相当简陋,所以我的每次测量之间的值可能会发生变化而我只是没有看到它(如果我知道这是测量的,我可以使用DebugDiag来抓取过程的转储相关的柜台达到一定的门槛,鸡肉和鸡蛋).

我目前的推测理论是,这个空间被保留用于增长原生(或管理我认为?)堆积,因为它们达到了他们的能力,但我没有任何证据证明这一点.所以它仍然坚定地投机于投机.

在互联网上搜索有关这方面的详细信息可能很痛苦,有许多帖子/文章/博客会混淆事物,使用自我引用定义(Performance Monitor的工作集定义的第一句就是一个很好的例子),不完整或完全错误.许多地方模糊定义或使用不一致的术语(请注意,VMMaps定义字段私有数据,继续将其称为私有内存,可能有点肛门投诉,但含糊不清).

现在我批评互联网的其余部分是为了让事情变得混乱和不正确...如果上面有什么内容没有意义,或者你可以向我展示相反的文档,或者你需要一个更明确的定义,让我知道,我也将自己列入违法者名单!我认为上半部试图向某人解释内存问题,在网上,确保我们都在谈论同样的事情.

最后这个问题:VMMap如何知道给定的内存区域是Thread Stack,具体来说呢?建议我可能永远找不到答案:/

UPDATE/EDIT:我发现通过打开gflags用户堆栈跟踪(gflags -i myapp.exe + ust),你可以增加私有数据的大小,我会假设这是回溯数据库,但是甚至没有gflags ,我仍在努力解决私人数据问题.

c# c++ memory winapi vmmap

8
推荐指数
1
解决办法
2985
查看次数

库的.h文件中"{return 0;}"或"{;}"的原因

我目前正在开发一个项目,其中包含一些陈旧的文档错误的代码,并且我试图浏览各种.h文件,他们提供了有关所有包含的所有函数的完整文档(定义保存在.lib中)和.dll文件).其中一个.h文件具有不仅声明的函数,而且还使用简单的返回语句或空语句来定义

class DLL ExampleLibraryClass {
public:
    int exampleGetValue() {return 0;}
    void exampleSetValue(Type val) {;}
    void exampleActionFxn() {;}
};
Run Code Online (Sandbox Code Playgroud)

这些将是我期望返回当前变量状态或执行某些操作的函数,这就是为什么这让我感到困惑.

另外:

  • 我使用了Dependency Walker,发现每个函数在dll中都有匹配的定义.

  • 关键字DLL已定义为

    #ifndef _PWSDLL_
    #   define _PWSDLL_
    #   define WINCALL  _stdcall
    #   ifdef _USRDLL
    #       define DLL  __declspec(dllexport)
    #   else
    #       define DLL  __declspec(dllimport)
    #   endif
    #endif
    
    Run Code Online (Sandbox Code Playgroud)

    _USRDLL未定义,因此DLL定义为__declspec(dllimport)

我的问题很少涉及空定义的明显效果(我没有做任何事情,并且已经在SO上进行了讨论)以及更多关于.h文件以这种方式编写以及如何利用文件的原因.这是一种常见的还是已知的做法?链接器是否仍会在链接库中查找函数的定义?还有其他代码片段我应该寻找更多线索吗?或者从最广泛的意义上讲,我该如何回应呢?

非常感谢,如果您需要更多信息来解决这个问题,请告诉我,我不确定在这个问题上究竟有什么重要.

编辑:在示例代码中添加了遗忘的返回类型.

编辑:添加了有关DLL定义的注释.

c++ dll header-files libraries

7
推荐指数
1
解决办法
452
查看次数

VC++在解决方案中从非/ clr项目的函数调用/ clr项目的函数

在提出这个问题之前我提到了这个有点类似的问题,但无法解决我的问题

我正在寻找一个包含许多解决方案的旧应用程序.问题出现在其中一个解决方案中(比如说S).情况如下:

  • S中的一个项目(比如P1)有所有的C/C++文件,需要调用一个C#函数
  • 由于P1也包含.c文件,我不能使用/clr选项
  • 如果我将P1中的.c文件编译为.cpp文件,那么它会产生大量错误,我不打算更改旧版.c文件中的源代码
  • 所以我创建了另一个项目(比如P2),/clr启用并创建了一个用于函数声明的头文件和一个用于函数定义的.cpp文件; C#呼叫是在它下面进行的; P2编译好
  • 请注意,P1是.dll,P2是作为静态库创建的;
  • 在P1的"框架和参考"中提到了P2

和警告:

警告LNK4098:defaultlib'MSVCRT'与使用其他库冲突; 使用/ NODEFAULTLIB:库

现在有了这些,我在P1中得到3个链接器错误:

错误LNK2005:已在libcmtd.lib(typinfo.obj)中定义的"private:__thiscall type_info :: type_info(class type_info const&)"(?? 0type_info @@ AAE @ ABV0 @@ Z)

错误LNK2005:已在libcmtd.lib(typinfo.obj)中定义的"private:class type_info&__thiscall type_info :: operator =(class type_info const&)"(?? 4type_info @@ AAEAAV0 @ ABV0 @@ Z)

错误LNK1169:找到一个或多个多重定义的符号

许多在线论坛(包括本网站)都提供此错误.但不知怎的,我在尝试这些选项后无法修复它(我是.NET框架的新手).
重要的是,即使我从P2中删除了C#代码,也会出现相同的错误.

修复它的正确方法是什么?

更新:

P2只包含1个带有函数声明的头文件和1个带有函数定义的源文件,它是对C#方法的1行调用; 例如

void Class::foo () {  // A static function inside Class
  std::string x = marshal_as<std::string>(C#_function);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

P2是新添加编译的/clr(删除P2使解决方案编译正常).
我正在用 …

c# c++ clr linker-errors visual-c++

5
推荐指数
1
解决办法
2749
查看次数

如何在Visual Studio中链接dll?

要链接静态库,我必须从 .h 和 .c 文件创建 .lib。然后我将其添加到我的项目中,放入附加依赖项并进行编译。

要使用 dll,我需要 .dll 和 .lib。这个.lib和上面的一样还是不一样?如何让 Visual Studio 使用 .dll 和 .lin,而不仅仅是 .lib?我将 .dll 放入项目目录中,但没有任何更改(.exe 具有相同的大小(我认为应该更小))。

c++ dll dynamic-linking visual-studio

1
推荐指数
1
解决办法
7666
查看次数