Tag: windows

在x64 DLL中强制名称修改

我正在将32位应用程序移植到64位。 该应用程序支持DLL的插件。 不幸的是,每个插件需要具有的强制函数之一称为FreeLibrary ,它当然与同名的kernel32 API冲突。 我的插件API使用FreeLibrary名称的原因是该应用程序源自FreeLibrary不与任何OS API冲突的不同平台。 但是,即使在使用FreeLibrary 32位Windows上也不是问题,因为32位DLL使用名称修改,即该函数存储为_FreeLibrary ,因此不会与kernel32 API冲突。 但是,在64位上,我现在遇到了一个问题,因为64位似乎没有使用名称修改。 在64位编译器创建一个名为FreeLibrary的符号,这当然与同名的kernel32 API冲突并拒绝链接,导致以下错误: Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. kernel32.lib(KERNEL32.dll) : error LNK2005: FreeLibrary already defined in test.o Creating library test.lib and object test.exp test.dll : fatal error LNK1169: one or more multiply defined symbols found 因此,我想知道是否有任何方法强制x64 […]

写入Fortran和C程序之间的管道时出现问题

我有一个由其他人用Fortran编写的程序,因此从标准输入中读取一些内容然后进行一些计算并输出结果。 我想要做的是使用来自另一个程序的不同输入数据多次运行它,由我用C语言编写。 要做到这一点,我使用popen : FILE *pipe = popen(“.\\program.exe”, “wt”); if (!pipe) { exit(1); } fprintf(pipe, “%d\n”, thing1); fprintf(pipe, “%d\n”, thing2); … pclose(pipe); 问题是它不能以这种方式工作。 它与“program.exe <input.txt”完美配合,但不是这种方式。 它读取第一件事然后输出这个愚蠢的错误:“IO-09系统文件错误 – 未知错误”。 当然我不知道这意味着什么,因为我从未编写过Fortran。 我究竟做错了什么? 编辑: 不幸的是,我没有该程序的源代码

_wfreopen适用于c:/path/file.txt但不适用于c:\ path \ file.txt?

TCHAR finalpath[MAX_PATH]; GetCurrentDirectory(MAX_PATH,finalpath); TCHAR filename[] = TEXT(“\\lista.txt”); wcscat(finalpath,filename); wprintf(L”List will be saved to %s”, finalpath); 所以这基本上证实了我的最终路径确实是c:\ somepath \ lista.txt 但_wfreopen(TEXT(finalpath),TEXT(“w”),stdout); 如果我只是改变它 _wfreopen(TEXT(“c:/somepath/lista.txt”),TEXT(“w”),stdout); 一切都工作正常,为什么以及如何让它接受我的最终路径arg? 谢谢

在MinGW g ++编译器中获取“tlhelp32.h”的编译错误

我正在编写一个简单的C ++应用程序来检查给定的exe文件示例:’a.exe’是否正在运行(Windows OS),我已经用Google搜索并在下面的链接中找到了一些代码。 http://stackoverflow.com/questions/3355379/how-do-i-find-out-if-a-exe-is-running-in-c 上面提到的代码使用头文件“tlhelp32.h”。 我只是复制了代码并进行了一些必要的更改,然后在MinGW中编译,出现了下一个问题,该头文件中提到的所有数据类型都出错了ex: ‘DWORD’ does not name a type, ‘LONG’ does not name a type, ‘WCHAR’ does not name a type,’CHAR’ does not name a type 在现有的头文件无法编译之前,我从未遇到过这种问题(是的,我已经检查了它)。 非常感谢任何帮助。 代码如下: #include int main() { PROCESSENTRY32 pe32 = {0}; HANDLE hSnap; int iDone; int iTime = 60; bool bProcessFound; while(true) // go forever { […]

什么阻止Windows中的驱动程序安装?

我在Windows中编写了一个C程序,它使用WinDivert中的一些预编译文件。 我的程序使用WinDivert中的.dll和.dll中的一些函数安装WinDivert.sys驱动程序。 还有一些来自WinDivert的文件是其中的一部分(.lib,.inf和另一个.dll)。 问题是,在我的一台计算机上(Windows 8.1 64位),一切都运行良好。 但是,当我尝试在我的笔记本电脑(Windows 8.1 64),我朋友的笔记本电脑(Windows 7 64)或其他Windows 7 64桌面上使用该程序时,会阻止安装驱动程序。 我不确定是什么阻止它或如何阻止它被阻止,因为在所有计算机上: +我正在运行管理员个人资料 +在管理员命令提示符下运行程序 +尝试禁用防火墙,防病毒等(尽管它可以运行正常,适用于有效的计算机) +据我所知,我所有的安全设置都是一样的 +注意:驱动程序确实有有效签名。 为什么驱动程序在一台计算机上完美安装,而在另外三台计算机上却没有? 可能有什么问题?

在C中查找机器的IP地址?

如何在Windows上以C语言获取本地计算机的IP地址? 我无法在以下代码中获取我的机器的IP地址: #include #include int main() { struct ifaddrs *id; int val; val = getifaddrs(&id); printf(“Network Interface Name :- %s\n”,id->ifa_name); printf(“Network Address of %s :- %d\n”,id->ifa_name,id->ifa_addr); printf(“Network Data :- %d \n”,id->ifa_data); printf(“Socket Data : -%c\n”,id->ifa_addr->sa_data); return 0; } 编译时我遇到错误: 致命错误C1083:无法打开包含文件:’net / if.h’:没有这样的文件或目录。 我不能使用#include 因为它只能在Linux上使用。

编写用于rundll32.exe的DLL

我有以下代码: mydll.h: #include __declspec(dllexport) void CALLBACK Entry(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); mydll.c: #include “mydll.h” void CALLBACK Entry(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow) { FILE *f; f = fopen(“C:\\Users\\user\\Desktop\\test.txt”, “rw”); fprintf(f, “test”); fclose(f); } 它编译为mydll.dll。 然后,当我尝试做的时候 rundll32.exe mydll.dll,Entry 它给了我错误信息 Error in mydll.dll Missing entry: Entry 我在这里想念的是什么?

C中的Windows虚拟麦克风

我刚才问了一个类似的问题,但我不太了解,所以我不够具体。 我想编写一个程序,从我的麦克风接收输入,处理它,然后将输出发送到假的“虚拟麦克风”,好像我创建的处理过的声音是麦克风听到的。 然后,我希望能够将此虚拟麦克风与任何支持选择麦克风输入(几乎任何编写良好的软件)的应用程序一起用作有效麦克风。 那么应用程序“听到”将是我处理的麦克风输入版本。 我正在使用C语言中的Portaudio,我可以从麦克风中捕获,处理并发送到扬声器就好了。 现在我需要用虚假麦克风替换应用程序中的真实扬声器。 Windows似乎有一些API。 http://msdn.microsoft.com/en-us/library/windows/hardware/ff536201%28v=vs.85%29.aspx所以我的接收器引脚将是真正的麦克风,我将不得不创建一个新的源引脚应该对其他应用程序可见。 我该怎么做呢? 我很难找到代码示例或者甚至是任何非常有用的文档。 语言:C OS:Windows 7

在C中获得无限输入?

所以我正在尝试编写一个允许用户输入无限量字符的函数。 例如: char string[100] 将输入限制为100个字符。 我到目前为止的代码是: #include char* uinput(){ char *string, *current; int counter = 0; string = (char *) malloc(10 * sizeof(char)); do{ realloc(string, counter * sizeof(char)); current = string + counter; *current = getchar(); counter++; }while(*current != ‘\n’); return string; } int main(){ char *s; s = uinput(); printf(“\nYou entered: %s”, *s); return […]

从剪贴板获取CF_DIBV5的位图

我正试图从剪贴板中获取位图数据。 我可以成功获取CF_DIBV5对象的头信息: BOOLEAN exists = IsClipboardFormatAvailable(CF_DIBV5) && OpenClipboard(session->windowHandle); if (exists) { HGLOBAL clipboard = GetClipboardData(CF_DIBV5); exists = clipboard != NULL; if (exists) { LPTSTR lptstr = GlobalLock(clipboard); exists = lptstr != NULL; if (exists) { BITMAPV5HEADER * header = clipboard; //now need the HBITMAP! } } } //… 我可以从标题中成功记录信息。 现在我想要实际的HBITMAP所以我可以将它传递给GetDIBits 。 文档说CF_DIBV5是一个BITMAPV5HEADER “后跟位图颜色空间信息和位图位”。 最后一部分让我感到讽刺,因为它用简单的英语。 我假设得到位图位,我需要将标题的大小和“颜色空间信息”添加到标题指针。 […]