小编The*_*802的帖子

使用FreeType进行编译时未解析的外部

我正在使用FreeType库在Visual Studio 2015中编译程序.以前,我使用相同的项目使用库来编译带有我自己的Font类(以及许多其他东西)的静态库.一切都很顺利,全班都很棒.不过,我最近改变了在项目一个Windows应用程序,通过改变Properties- > General- > Configuration TypeApplication (.exe).这样,我可以同时编写程序并编辑代码,而无需复制所有20个文件.

在编写了我的简单程序(与问题无关)并尝试重新编译之后,我收到了许多我以前没有得过的错误.它们如下:

LNK2001未解析的外部符号__imp__strncpy [...]\freetype.lib(ftbase.obj)

LNK2001未解析的外部符号__imp__fread [...]\freetype.lib(ftsystem.obj)

LNK2001未解析的外部符号__imp__realloc [...]\freetype.lib(ftsystem.obj)

LNK2001未解析的外部符号__imp__strstr [...]\freetype.lib(truetype.obj)

LNK2001未解析的外部符号__except_handler4_common [...]\MSVCRT.lib(_chandler4gs_.obj)

关于这些中的任何一个,网上似乎很少,更不用说这个特例了.当我编译为静态库时,一切都很顺利.我之前已经切换到编译了.exe,它也工作得很好.我过去曾处理过未解决的外部问题,但这似乎无法解释.

我正在联系 #pragma comment(lib, "freetype.lib").freetype.lib存在并且在正确的目录中.

我包括:

#include <ft2build.h>
#include FT_FREETYPE_H
Run Code Online (Sandbox Code Playgroud)

如果重要,我的程序是用C++编写的,我也在和其他库连接.任何帮助表示赞赏.

linker freetype unresolved-external visual-studio-2015

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

C++如同从另一个线程锁定互斥锁?

我正在编写一个Audio类,std::thread用于异步地重新填充一些缓冲区.假设我们调用主线程A和后台(类成员)线程B.我正在使用一个std::mutex阻止线程B,只要声音没有播放,那样它就不会在后台运行时不必要而且不使用CPU功率过剩.默认情况下,线程A锁定互斥锁,因此线程B被阻塞,然后当播放声音线程A时,解锁互斥锁并且线程B在循环中运行(通过锁定然后立即解锁).

当线程B看到它到达文件末尾时,问题出现了.它可以停止播放和清理缓冲区等,但它不能停止自己的循环,因为线程B无法从线程A锁定互斥锁.

这是相关的代码大纲:

class Audio {
private:

    // ...

    std::thread Thread;
    std::mutex PauseMutex;    // mutex that blocks Thread, locked in constructor
    void ThreadFunc();     // assigned to Thread in constructor

 public:

    // ...

    void Play();
    void Stop();
}
Run Code Online (Sandbox Code Playgroud)

_

void Audio::ThreadFunc() {

    // ... (include initial check of mutex here)

    while (!this->EndThread) {    // Thread-safe flag, only set when Audio is destructed

            // ... Check and refill buffers as necessary, etc ...

        if (EOF)
             Stop(); …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading mutex

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

win32 hInstance是否独一无二?

我正在编写一个缓存处理程序,它需要为每个应用程序实例提供一个唯一的ID号,这样当有人在两个实例中打开两个项目时,缓存就不会混淆了.根据这个线程,看起来HINSTANCE传递的WinMain是模块的句柄,它可以只是exe,不一定是唯一的进程ID.

线程似乎说有关要运行的模块/进程的信息只被带入内存一次,并且HINSTANCE是一个句柄.这是否意味着HINSTANCE不能将其用作流程的唯一标识符,因为它们都指向同一个模块?还是我弄错了?

c++ win32-process hinstance

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

C++/Win32:非前台窗口的键盘输入

我的目标:

我希望我的应用程序能够响应特定的键盘快捷键/热键,而不管它是否是前台窗口,而不会干扰其他应用程序对这些快捷键的使用。

例如,如果另一个进程有前台窗口并且用户按下该VK_MEDIA_PLAY_PAUSE键,我希望我的应用程序当前前台窗口做出响应。

此功能是用户设置,因此我不担心不受欢迎的行为。

我尝试过但没有奏效的事情:

  1. WM_KEYDOWN 消息仅发送到当前前台窗口,因此我的应用程序不会收到它们。
  2. GetKeyState(),根据MS docs,根据最近检索到的WM_KEY*消息返回密钥的状态,并且因为我的应用程序没有WM_KEYDOWN作为后台窗口接收,所以这个状态不会改变。
  3. GetAsyncKeyState(),根据MS 文档,在以下情况下返回零:

前台线程属于另一个进程,桌面不允许钩子或日志记录。

我不确定这的后半部分是什么意思,但是GetAsyncKeyState()当我的窗口不是前景窗口时返回零。

  1. GetKeyboardState(),如GetKeyState(),仅在检索消息时更改密钥状态。

  2. RegisterHotKey()/ UnregisterHotKey():与其他选项不同,我的应用程序能够响应热键,即使它不是前台窗口;但是,当前的前景窗口不再响应。似乎这些热键仅重定向到我的应用程序,而其他应用程序根本不再看到它们。

我唯一的(凌乱的)想法:

我能想到的唯一方法是那些我相当肯定会让我被 Win32 社区回避的方法。

我可以使用RegisterHotKey()/UnregisterHotKey()来获得热键的通知,然后将按键模拟到当前的前景窗口。看到SendInput()可能会进入循环,我需要先取消注册热键:

case WM_HOTKEY:
     UnregisterHotKey(...);        // unregister the hotkey to avoid looping
     SendInput(...);               // send keyboard input
     RegisterHotKey(...);          // restore it
Run Code Online (Sandbox Code Playgroud)

或直接模拟它SendMessage()

case WM_HOTKEY:
     SendMessage(GetForegroundWindow(), WM_KEYDOWN, ...);
     // send WM_KEYUP …
Run Code Online (Sandbox Code Playgroud)

c++ windows keyboard winapi keyboard-shortcuts

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