С++ API DataStage 0xc000007b

Кто-нибудь может дать мне совет, как реализовать соединение DataStage?
Ссылка API: https://www.ibm.com/docs/en/iis/11.3?topic=interfaces-infosphere-datastage-development-kit
Я пытаюсь включить API, но при запуске программы получаю сообщение об ошибке: 0xc000007b
Где я ошибся?
Спасибо за ответ!

main.cpp

#include <iostream>
#include "dsapi.h"

int main() {
    DSSetServerParams("domain", "username", "password", "server");
    char* result = DSGetProjectList();
    if(result != NULL)
    {
        printf(result);
    }
    else
    {
        printf(DSGetLastError());
    }
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(datastage_api)

set(CMAKE_CXX_STANDARD 17)

add_library(vmdsapi SHARED IMPORTED)
set_target_properties(
        vmdsapi
        PROPERTIES LINKER_LANGUAGE CXX COMPILE_FLAGS "-m32" LINK_FLAGS "-m32"
        IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/vmdsapi.dll
        IMPORTED_IMPLIB ${PROJECT_SOURCE_DIR}/lib/vmdsapi.lib)

add_library(ACS_client_cpp STATIC IMPORTED)
set_target_properties(
        ACS_client_cpp
        PROPERTIES LINKER_LANGUAGE CXX COMPILE_FLAGS "-m32" LINK_FLAGS "-m32"
        IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/ACS_client_cpp.dll
)

add_library(ACS_common_cpp STATIC IMPORTED)
set_target_properties(
        ACS_common_cpp
        PROPERTIES LINKER_LANGUAGE CXX COMPILE_FLAGS "-m32" LINK_FLAGS "-m32"
        IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/ACS_common_cpp.dll)

add_library(DSCLNT32 STATIC IMPORTED)
set_target_properties(
        DSCLNT32
        PROPERTIES LINKER_LANGUAGE CXX COMPILE_FLAGS "-m32" LINK_FLAGS "-m32"
        IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/DSCLNT32.dll)

add_library(dsrpc32 STATIC IMPORTED)
set_target_properties(
        dsrpc32
        PROPERTIES LINKER_LANGUAGE CXX
        IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/dsrpc32.dll)

add_library(invocation_cpp STATIC IMPORTED)
set_target_properties(
        invocation_cpp
        PROPERTIES LINKER_LANGUAGE CXX
        IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/invocation_cpp.dll)

add_library(xmogrt STATIC IMPORTED)
set_target_properties(
        xmogrt
        PROPERTIES LINKER_LANGUAGE CXX
        IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/xmogrt.dll)

include_directories(${PROJECT_SOURCE_DIR}/inc)
link_directories(${PROJECT_SOURCE_DIR}/lib)

add_executable(datastage_api main.cpp )
set_target_properties(datastage_api PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

target_link_libraries (datastage_api vmdsapi ACS_client_cpp ACS_common_cpp DSCLNT32 dsrpc32 invocation_cpp xmogrt)

add_custom_command(
        TARGET datastage_api POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "${PROJECT_SOURCE_DIR}/lib/vmdsapi.dll"
        "$<TARGET_FILE_DIR:datastage_api>")

Производительность ProcessMonitor:
Попытка найти x64 dll

введите здесь описание изображения

Похоже, wow64.dll не имеет аналога x32. Это правильно?
Как работает эта библиотека?

введите здесь описание изображения

Получить ошибку: 0xc000007b

После закрытия я поймал выход потока со статусом выхода: -1073741701

Странно, что в используемых модулях не было dll из CMakeLists.txt Modules:

SFC.DLL
WINTRUST.dll
ntmarta.dll
GrooveIntlResource.d
UIRibbonRes.dll
7-zip.dll
fzshellext_64.dll
TortoiseOverlays.dll
cpwinet.dll
pkivalidator.dll
cpsspap.dll
cpschan.dll
cpadvai.dll
detoured.dll
cpcrypt.dll
Explorer.EXE
ntoskrnl.exe
UIRibbon.dll
DUI70.dll
ucrtbase.dll
msoshext.dll
prremote.dll
ieproxy.dll
werconcpl.dll
wscui.cpl
tiptsf.dll
ShellExImpl.dll
ShellEx.dll
zipfldr.dll
igfxDTCM.dll
WSCAPI.dll
wscinterop.dll
syncui.dll
framedynos.dll
DUser.dll
SyncCenter.dll
bthprops.cpl
srchadmin.dll
cscobj.dll
cscui.dll
EthernetMediaManager
SettingMonitor.dll
NetworkUXBroker.dll
pnidui.dll
PortableDeviceTypes.
wpdshserviceobj.dll
mssprxy.dll
AUDIOSES.DLL
wcmapi.dll
Actioncenter.dll
Syncreg.dll
SHDOCVW.dll
dxp.dll
prnfldr.dll
Windows.UI.Shell.dll
BatMeter.dll
stobject.dll
EhStorShell.dll
NetworkExplorer.dll
GROOVEEX.DLL
ieframe.dll
MSVCP140.dll
MLANG.dll
zlib1_tgit.dll
VCRUNTIME140.dll
VCRUNTIME140_1.dll
gitdll.dll
libgit2_tgit.dll
TortoiseGit.dll
TortoiseGitStub.dll
Windows.Internal.She:20
DDRAW.dll
d3d10_1core.dll
GLU32.dll
OPENGL32.dll
igfxLHM.dll
Windows.Networking.Slease.160715-1
DCIMAN32.dll
d3d10_1.dll
igfxDI.dll
igfxDH.dll
atlthunk.dll
Windows.Security.Aut0410)
wpnprv.dll
Windows.Networking.C42
NotificationObjFacto
wpnapps.dll
Windows.Web.dll
npsm.dll
AboveLockAppHost.dll
NotificationControll
ntshrui.dll
twinui.pcshell.dll
edputil.dll
thumbcache.dll
windows.immersiveshe28.04.20187:2
TwinUI.dll
explorerframe.dll
dataexchange.dll
OLEACC.dll
SndVolSSO.DLL
SharedStartModel.dll
settingsynccore.dll
wwapi.dll
AppVEntSubsystems64.
NotificationControll
settingsyncpolicy.dl
TWINAPI.dll
MSOXEV.DLL
wlidprov.dll
TokenBroker.dll
twinui.appcore.dll
execmodelproxy.dll
DAVHLPR.dll
ntlanman.dll
drprov.dll
WorkFoldersShell.dll
sfc_os.dll
twext.dll
OneCoreCommonProxySt
provsvc.dll
MsftEdit.dll
msiltcfg.dll
NInput.dll
InputSwitch.dll
Geolocation.dll
keepaliveprovider.dl
IDStore.dll
PhotoMetadataHandler
hgcpl.dll
dlnashext.dll
imapi2.dll
BiWinrt.dll
SYNCENG.dll
StructuredQuery.dll
Windows.Storage.Sear
deviceaccess.dll
Windows.Globalizatio
Windows.UI.Immersive
Windows.UI.dll
wincorlib.DLL
gdiplus.dll
ondemandconnroutehel
MPR.dll
msxml6.dll
MrmCoreR.dll
comctl32.dll
ActXPrxy.dll
MFPlat.DLL
WINBRAND.dll
RTWorkQ.DLL
cscapi.dll
StateRepository.Core
Windows.StateReposit
iertutil.dll
srvcli.dll
cdp.dll
urlmon.dll
WININET.dll
winsqlite3.dll
wpncore.dll
VERSION.dll
CHARTV.dll
DevDispItemProvider.
NETAPI32.dll
policymanager.dll
rmclient.dll
dsreg.dll
LocationFrameworkPS.
IconCodecService.dll
ShellExtensionX64.dl
d2d1.dll
SAMLIB.dll
MMDevApi.dll
igc64.dll
XmlLite.dll
npmproxy.dll
igd10iumd64.dll
es.dll
wlanapi.dll
UIAnimation.dll
DEVRTL.dll
d3d11.dll
usermgrcli.dll
wkscli.dll
wintypes.dll
CoreUIComponents.dll
windowscodecs.dll
PortableDeviceApi.dl
hcproviders.dll
wevtapi.dll
netprofm.dll
WMICLNT.dll
PROPSYS.dll
wer.dll
WINHTTP.dll
Secur32.dll
smartscreenps.dll
dhcpcsvc.DLL
dhcpcsvc6.DLL
CoreMessaging.dll
globinputhost.dll
dcomp.dll
MSOHEVI.DLL
MSWB7.dll
wtsapi32.dll
fwpuclnt.dll
Bcp47Langs.dll
WINNSI.DLL
dwmapi.dll
apphelp.dll
nlaapi.dll
sppc.dll
WINMMBASE.dll
SLC.dll
WINMM.dll
pcacli.dll
UxTheme.dll
twinapi.appcore.dll
msvcp110_win.dll
VEEventDispatcher.dl
resourcepolicyclient
DEVOBJ.dll
dxgi.dll
WLDP.DLL
DPAPI.DLL
schannel.DLL
rsaenh.dll
IPHLPAPI.DLL
DNSAPI.dll
netutils.dll
USERENV.dll
mswsock.dll
cpmsi.dll
msi.dll
cryptsp.dll
CRYPTBASE.dll
NTASN1.dll
ncrypt.dll
SspiCli.dll
EventAggregation.dll
sxs.dll
WINSTA.dll
bcrypt.dll
kernel.appcore.dll
profapi.dll
powrprof.dll
KERNELBASE.dll
bcryptPrimitives.dll
ucrtbase.dll
windows.storage.dll
CRYPT32.dll
shcore.dll
msvcp_win.dll
win32u.dll
gdi32full.dll
cfgmgr32.dll
combase.dll
shlwapi.dll
coml2.dll
MSCTF.dll
RPCRT4.dll
msvcrt.dll
ole32.dll
COMDLG32.dll
PSAPI.DLL
sechost.dll
WS2_32.dll
KERNEL32.DLL
IMM32.DLL
GDI32.dll
clbcatq.dll
SETUPAPI.dll
ADVAPI32.dll
NSI.dll
USER32.dll
SHELL32.dll
OLEAUT32.dll
ntdll.dll


person Sterkhov    schedule 06.07.2021    source источник
comment
Вероятно, ваше приложение 32-разрядное, но вы пытаетесь загрузить 64-разрядный модуль/DLL или наоборот (приложение 64-разрядное, и вы пытаетесь загрузить 32-разрядный модуль/DLL).   -  person PaulMcKenzie    schedule 06.07.2021
comment
@PaulMcKenzie Я проверил это.   -  person Sterkhov    schedule 07.07.2021
comment
И как вы это проверили? Если у вас есть библиотеки DLL с тем же именем, но обнаруженные алгоритмом поиска Windows DLL, Windows попытается загрузить DLL независимо от типа приложения, которое вы будете запускать. Если вы используете 32-разрядное приложение, но Windows находит 64-разрядную библиотеку DLL с таким именем, Windows попытается загрузить ее и, таким образом, получит сообщение об ошибке. То же самое с 64-битным приложением и 32-битной DLL. см. этот ответ.   -  person PaulMcKenzie    schedule 07.07.2021
comment
Кроме того, показ исходного кода основной программы не поможет в решении проблемы. Ваша 32-битная программа и 64-битная программа будут выглядеть совершенно одинаково с точки зрения исходного кода. Проблема заключается во времени выполнения, а не в компиляции. Так ваша программа 32-битная или 64-битная? Вы вообще не упомянули об этом.   -  person PaulMcKenzie    schedule 07.07.2021
comment
@PaulMcKenzie Я использовал dumpbin.exe /headers для dll и увидел заголовок x86. В моем CmakeLists.txt установлены флаги -m32 для библиотек и исполняемых файлов. Я попробую запустить программу на станции с окнами x32 завтра. Но я не уверен, что это решит проблему. У вас есть другие варианты?   -  person Sterkhov    schedule 07.07.2021
comment
ОС Windows все равно, что есть в дампбине. Опять же, если имя DLL соответствует тому, что Windows находит во время выполнения, Windows попытается загрузить эту DLL. Windows не пропускает DLL, если она не соответствует разрядности приложения. Вот что вызывает 0xc000007b ошибки. Вот описание поиска DLL Заказать.   -  person PaulMcKenzie    schedule 07.07.2021
comment
@PaulMcKenzie, как я могу проверить класс битов dll? Нужно ли запускать программу на 32-битной ОС для разрешения?   -  person Sterkhov    schedule 07.07.2021
comment
Смотрите связанный ответ. Вам нужно использовать утилиту, которая показывает, какая DLL загружается и где.   -  person PaulMcKenzie    schedule 07.07.2021
comment
@PaulMcKenzie, Подскажите, пожалуйста, что за утилита?   -  person Sterkhov    schedule 07.07.2021
comment
монитор процессов. Опять же, см. связанный ответ. Я никогда не использовал этот инструмент, но ответ, набравший 15 голосов, использовал его для диагностики ошибки.   -  person PaulMcKenzie    schedule 07.07.2021
comment
@PaulMcKenzie Спасибо! Я вернусь позже.   -  person Sterkhov    schedule 07.07.2021
comment
@PaulMcKenzie Привет. Можете ли вы прокомментировать статус выхода: -1073741701? Как я могу определить плохую dll?   -  person Sterkhov    schedule 08.07.2021
comment
Ваш код C++ кажется законным. Я вижу, что вы принимаете решение перейти к разработке x86 (32-разрядной версии), как подробно описано в разделе CMakeList.txt. Вы не можете быть в безопасности от скрытой x64 DLL здесь или там. Ссылка на любую несовместимую ссылку на 64-разрядную DLL приведет к повышению 0xc000007b . Я предлагаю вам переписать CMakeLists.txt, чтобы приспособить 64-битные ссылки для устранения неполадок сейчас.   -  person Bilal Qandeel    schedule 13.07.2021


Ответы (1)


Вы можете добавить следующие две строки, чтобы убедиться, что ваш код компилируется как 32-битный:

set(CMAKE_C_FLAGS -m32)
set(CMAKE_CXX_FLAGS -m32)

Легенды гласят, что если вы будете использовать Eclipse IDE, это произойдет автоматически, а CLion не обязательно делать.

person Bilal Qandeel    schedule 12.07.2021
comment
Спасибо! Я исправляю это с помощью консоли x86 Visual Studio и отмечаю -A Win32, возможно, это тоже работает. - person Sterkhov; 13.07.2021