我陷入了一个奇怪的问题。相同的代码可以在dll外部完美运行,但不能在dll内部运行。
dll内的代码。错误和空值:
// 1813 here
HRSRC hrsrc = FindResourceW(hInstance,
MAKEINTRESOURCE(IDD_DIALOG1),
RT_DIALOG);
// NULL here.
HGLOBAL hg = LoadResource(hInstance, hrsrc);
外部dll,一切正常:
// Pointer here, all fine
HRSRC hrsrc = FindResourceW(hInstance,
MAKEINTRESOURCE(IDD_DIALOG1),
RT_DIALOG);
// Pointer here.
HGLOBAL hg = LoadResource(hInstance, hrsrc);
该资源确实存在于dll资源中,我检查甚至重新创建了资源文件。并且在两种情况下都可以编译,没有Symbol not resolved
错误。
是的,我将hInstance
参数传递给dll函数。 double* arr = ShowXMinXMaxDialogDisableParent(hInst, hWnd, xMin, xMax);
不为null(至少在调试时)。我在WinMain函数中初始化hInstance
,所以它是正确的:
// main function
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
hInst = hInstance;
我不知道怎么了。 hInstance错了吗?显然,我使用调试器进行了检查。没有变化,值绝对相同。
解决方案:
需要使用DLL实例,而不是应用程序实例。我可以通过DllMain dll函数来获取它。
答案 0 :(得分:3)
在DLL中,HMODULE
的{{1}}参数应该是 DLL 的FindResource(hInst …)
,而不是hInstance
的{{1}}。使用WinMain
的第一个参数的值并将其存储在某个位置。
据我了解,您使用的是传递给DLL的DllMain()
中的hInstance
吗?
答案 1 :(得分:3)
您将错误的tblCls <- reactive({
req(input$file1) # if else not needed when using req()
head(read.csv(input$file1$datapath, header = input$header), 5)
})
output$class <- renderPrint({
str(tblCls())
})
textOutput("class")
传递给FindResource()
和LoadResource()
函数。您正在从HINSTANCE
函数传递HINSTANCE
,这仅对位于EXE文件中的资源正确。
您要从DLL加载资源,因此必须传递DLL的WinMain()
,而必须在DllMain()
函数中获取。