小编Cri*_*ati的帖子

延迟在释放模式下加载dll

在我正在使用Visual Studio(C++ 2010 Express)构建的C项目中,我使用MatLab引擎允许用户提供在项目中使用的自定义函数.问题是此代码还需要能够在没有安装MatLab的计算机上运行,​​这意味着在这种情况下计算机上将无法使用所需的DLL.当然,这应该仅在用户不尝试访问调用matlab引擎的代码段时才有效(我已为此提供了一个标志).

我有3个dll是这个场景所需要的.

  • libmx.dll
  • libmex.dll
  • libeng.dll

到目前为止,我已经能够使用LoadLibraryGetProcAddress在运行时加载libeng.dll .另外两个DLL有点困难,除了调用MatLab引擎的C代码之外,代码也经常被编译为mex文件(MatLab可执行文件),以允许用户从MatLab调用它.当编译为mex文件时,libmx.dll和libmex.dll都由mex编译器动态链接.这意味着使用LoadLibraryGetProcAddress不适用于这些DLL.

现在我只是将libmx和libmex LIB添加到visual studio中的链接器属性,这样可以正常工作,但对于没有安装MatLab的人来说是不可能的.

我尝试使用delayLoad,如果我在调试模式下编译,这可行,但在我在发布模式下编译时会出现此构建错误.

1>C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmx.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x2B8
Run Code Online (Sandbox Code Playgroud)

如果没有访问使用它们的代码部分,有没有办法完全跳过查找/加载这些DLL?

这是链接器的命令行:

/OUT:"C:\Users\A.Vandenber\documents\visual studio 2010\Projects\Flash\Release\Flash.exe" /NOLOGO "C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmx.lib" "C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmex.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DELAYLOAD:"libmex.dll" /DELAYLOAD:"libmx.dll" /MANIFEST /ManifestFile:"Release\Flash.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Users\A.Vandenber\documents\visual studio 2010\Projects\Flash\Release\Flash.pdb" /OPT:REF /OPT:ICF /PGD:"C:\Users\A.Vandenber\documents\visual studio …
Run Code Online (Sandbox Code Playgroud)

c dll matlab matlab-engine visual-studio

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

错误LNK2019:未解析的外部符号"toString(int)"

环境:Windows XP.Visual Studios 2010.语言 - C++.

我遇到了以下链接错误,并且已经没有想法如何解决此问题.我有一个项目(CnD设备),它链接到我的小组控制的2个项目(消息和碳).我试图在3个项目之间搜索项目属性

enter tcp_driver.obj : error LNK2019: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl toString(int)" (?toString@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) referenced in function "protected: bool __thiscall Tcp_Driver::readMessage(void)" (?readMessage@Tcp_Driver@@IAE_NXZ)
Run Code Online (Sandbox Code Playgroud)

我相信这个问题是因为我没有链接到标准C++库中的字符串.我一遍又一遍地扫描了我的房产清单.以下是我认为对此问题至关重要的一些属性.

CnD设备属性信息:

  1. 配置类型动态库.dll
  2. 使用 MFC在共享DLL中使用MFC
  3. 使用ALT不使用ALT
  4. 字符集使用多字节字符集
  5. 运行时库多线程DLL(/ MD)
  6. 其他依赖项 msvcprtd.lib,Carbon.lib,BUFFER_API.lib,BUFFER_FRAMEWORK.lib,Messages.lib
  7. 忽略所有默认库

消息属性信息:

  1. 配置类型静态库(.lib)
  2. 使用 MFC在共享DLL中使用MFC
  3. 使用ALT不使用ALT
  4. 字符集使用Unicode字符集
  5. 运行时库多线程DLL(/ MD)
  6. 额外的依赖关系
  7. 链接库依赖关系

碳属性信息:

  1. 配置类型静态库(.lib)
  2. 使用 MFC在共享DLL中使用MFC
  3. 使用ALT不使用ALT
  4. 字符集使用Unicode字符集
  5. 运行时库多线程DLL(/ MD)
  6. 链接库依赖关系

我的CnD链接输出是:

1>------ Rebuild …
Run Code Online (Sandbox Code Playgroud)

stdstring visual-studio-2010 unresolved-external lnk2019 c++-standard-library

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

在MS Visual C上链接到protobuf 3时出错

在Visual Studio 2013上遇到,但它可以与任何版本重现.

我从github克隆了协议缓冲库,在它上面运行了CMake-gui(我将所有内容都保留为默认值,因此它是静态版本),只构建libprotobuf(其他项目由于某种原因失败,cmd.exe错误,可能有事情要做有测试,但libprotobuf构建良好).

我的项目使用在mapbox矢量tile规范的github上找到的.proto文件生成的标题.

当我链接时,我首先有这个错误

Error 1 error C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' s:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility

我尝试-D_SCL_SECURE_NO_WARNINGS在其他命令行参数中禁用它,但后来我有其他错误:

Error 1 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in main.obj S:\eiogit3\misc-projs\mapload\mapload\libprotobufd.lib(common.obj)

c++ protocol-buffers visual-studio visual-c++ visual-studio-2013

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

Visual Studio 中(基于字符的)STL(流)容器的编译错误

这基本上与[SO]: C2491: 'std::numpunct<_Elem>::id' : Define of dllimport static data member not allowed [close] 相同,但考虑以下事实:

  • (在我看来)这是一个完全有效的问题(根据[SO]:如何创建一个最小的、完整的和可验证的示例),我真的不知道为什么有些用户有关闭它的冲动
  • 标记为解决方案的答案提供了修复错误的指南(一般而言),但不适用于当前情况,并且当然不会修复它

请不要将其关闭或将其标记为重复项(至少,在没有仔细阅读和理解的情况下)。

主要.cpp

#include <sstream>


//#define THROW_C2491
#if defined(THROW_C2491)
typedef int CharType;
#else
typedef char CharType;
#endif


int main() {
    std::basic_stringstream<CharType> stream;
    CharType c = 0x41;
    stream << c;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码稍作修改(简化),如果 THROW_C2491定义则无法编译:

xlocnum(294): error C2491: 'std::numpunct<_Elem>::id': definition of dllimport static data member not allowed
Run Code Online (Sandbox Code Playgroud)

输出

xlocnum(294): error C2491: 'std::numpunct<_Elem>::id': definition of …
Run Code Online (Sandbox Code Playgroud)

c++ windows dllimport visual-studio visual-c++

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

从批处理文件启动时,Visual Studio 2017 命令行工具不起作用

我遇到了一个非常奇怪的行为,旧的批处理文件在 Windows XP 下运行良好。为什么hello.c在cmd窗口中通过批处理文件编译(Vs2017 + Win10)下的简单文件时不起作用?

当意识到Win10有新的安全策略时,我在微软网站上阅读了一些文章。他们建议使用开发人员命令行窗口进行命令行编译。

确实,手动操作效果很好。但是当我以超级管理员身份登录Win10并尝试通过批处理文件运行所有内容时,它不起作用,只是完成了环境配置。

手动运行批处理文件中的命令时,一切都按预期工作(成功生成可执行文件)。这有什么问题?

这是批处理文件的内容:

%comspec% /k "C:\Program Files(x86)\Microsoft Visual Studio\2017  \Community\VC\Auxiliary\Build\vcvars64.bat"
cd g:\testdir
g: 
cl TestBatFileCompile.c
Run Code Online (Sandbox Code Playgroud)

windows cmd batch-file visual-studio

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

键盘事件未使用 pywin32 发送到窗口

我写了一个代码,可以从我想要的任何程序中获取 HWND。如果你问的话,这就是我得到 hwnd 的方式。

以下代码应调出设备管理器并将向下箭头发送到程序。

但它确实。它确实会调出设备管理器,但它不会向程序发送向下箭头键,至少没有任何反应。

如果我使用记事本窗口的 hwnd 代码更改 hwndMain 编号,该代码会起作用并发送向下箭头键

import win32api
import win32con
import win32gui
import time

hwndMain = 133082
hwndChild = win32gui.GetWindow(hwndMain, win32con.GW_CHILD)
win32gui.SetForegroundWindow(hwndMain)
time.sleep(1)

win32api.SendMessage(hwndChild, win32con.WM_CHAR, 0x28, 0)
Run Code Online (Sandbox Code Playgroud)

编辑

我试过了

win32api.SendMessage(hwndChild, win32con.WM_CHAR, win32con.WM_KEYDOWN, 0)
Run Code Online (Sandbox Code Playgroud)

代替

win32api.SendMessage(hwndChild, win32con.WM_CHAR, 0x28, 0)
Run Code Online (Sandbox Code Playgroud)

但这也行不通。

我在 python 2.7

python windows pywin32 python-2.7

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

在Python中直接从内存中保存多个对象以压缩

我想将循环创建的多个对象(例如图形)直接保存到 zip 文件中,而不将它们保存在目录中。

目前我将这些数字保存在一个文件夹中,然后压缩它们。

    import matplotlib.pyplot as plt
    from zipfile import ZipFile

    for i in range(10):
        plt.plot([i, i])
        plt.savefig('fig_' + str(i) + '.png')
        plt.close()

    image_list = []
    for file in os.listdir(save_path):
        if file.endswith(".png"):
            image_list.append(os.path.join(save_path, file))

    with ZipFile(os.path.join(save_path, 'export.zip'), 'w') as zip:
        for file in image_list:
            zip.write(file)
Run Code Online (Sandbox Code Playgroud)

在肯定回答的情况下,有没有办法对任何类型的对象做同样的事情,还是取决于对象类型?

非常感谢

python zip matplotlib zipfile

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

用相同的键组合两个或多个字典

我有两个字典项目u_items

items = {"A": 1, "B": 2, "C": 3}

u_items = {"D": 4, "B": 4, "E": 8, "C": 4}
Run Code Online (Sandbox Code Playgroud)

我想用u_items更新项目字典,所以我这样做了

items.update((k + '_1' if k in items else k, v) for k, v in u_items.items())
Run Code Online (Sandbox Code Playgroud)

这样我就可以区分两个字典的键

输出:

items = {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'B_1': 4, 'E': 8, 'C_1': 4}
Run Code Online (Sandbox Code Playgroud)

但是当我用另一个字典更新项目字典时,假设n_items,它将替换B_1的值而不是使其变为B_1_1

n_items = {"C":7, "B":9}

items.update((k + '_1' if k in items else k, v) for k, v in n_items.items())
Run Code Online (Sandbox Code Playgroud)

输出:

{'A': 1, 'B': …
Run Code Online (Sandbox Code Playgroud)

python dictionary list-comprehension python-3.x

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

如何在 Windows 10 上安装特定 Python 版本的包?

我目前在Windows 10上有 Python 3.7.4(64 位)和 Python 3.6.6(64 位)这两个版本都在我的系统环境变量(路径)中。

我以前只有3.7,安装了3.6来使用pocketsphinx,现在我想升级PyAudio我的3.6。所做的pip install --upgrade pyaudio就是升级pyaudio3.7。那么,如何在 Windows 计算机上升级(甚至安装)特定 python 版本的包?

这也是我尝试过的:
python-3.6.6 pip install --upgrade pyaudio
python3.6.6 pip install --upgrade pyaudio和。 是的,这些也许很愚蠢,但我却无可奈何。
python3.6 pip install --upgrade pyaudio
pip3.6.6 install --upgrade pyaudio

编辑1:
我还pip install --upgrade pyaudio通过在安装Python 3.6的目录中打开它来在power shell中运行,这是(Windows的默认安装目录):C:\Users\--user-name--\AppData\Local\Programs\Python\Python36例如: 这就是正在发生的事情,但它不起作用 从版本中可以看出,pip install仍然会安装 python 3.7 的新软件包

python package-managers python-3.x

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

PyWin32 (226) 和虚拟环境

[PyPI]: pywin32 226已于20191110发布。
适用于大多数Python安装(例如适用于从Python下载的官方版本),但不适用于虚拟环境(例如 使用VirtualEnv ( v16.7.7 )创建,以及(基于进一步研究)Pythonvenv)。
我使用Python v3.8 .0v3.7 .3作为实验室老鼠。这是前者的输出:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q058805040]> "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\Scripts\python.exe" -c "import win32api"
Fatal Python error: init_import_size: Failed to import the site module
Python runtime state: initialized
Traceback (most recent call last):
  File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line 769, in <module>
    main()
  File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line 746, in main
    paths_in_sys = addsitepackages(paths_in_sys)
  File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line …
Run Code Online (Sandbox Code Playgroud)

python windows pywin32 virtualenv

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